From: Jeremy Bícha Date: Wed, 5 Feb 2025 12:53:09 +0000 (-0500) Subject: New upstream version 48~beta X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~173^2 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=50e6a8d3a5c8987ce2131353aca6e70e85a1bdeb;p=gnome-shell.git New upstream version 48~beta --- 50e6a8d3a5c8987ce2131353aca6e70e85a1bdeb diff --cc data/theme/gnome-shell-dark.css index f0f9facb0,000000000..ddd76575b mode 100644,000000..100644 --- a/data/theme/gnome-shell-dark.css +++ b/data/theme/gnome-shell-dark.css @@@ -1,3236 -1,0 +1,3206 @@@ +/* This stylesheet is generated, DO NOT EDIT */ +/* Copyright 2009, 2015 Red Hat, Inc. + * + * Portions adapted from Mx's data/style/default.css + * Copyright 2009 Intel Corporation + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU Lesser General Public License, + * version 2.1, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for + * more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* Global Values */ +stage { + font-size: 1em; + color: #ffffff; } + +/* Common Stylings */ +#dash .dash-item-container .show-apps, +#dash .dash-item-container .overview-tile, +#dash .dash-item-container .grid-search-result { + background: none; + box-shadow: none; + border: none; + border-radius: 0; + padding: 0; + margin: 0; } + +.app-folder-dialog .overview-tile, .app-folder-dialog .grid-search-result, .app-folder, .overview-tile, .grid-search-result, #dash .dash-item-container .show-apps .overview-icon, +#dash .dash-item-container .overview-tile .overview-icon, +#dash .dash-item-container .grid-search-result .overview-icon, .list-search-result, .search-provider-icon, .switcher-list .item-box, .audio-device-selection-dialog .audio-selection-box .audio-selection-device { + border-radius: 16px; + padding: 6px; + spacing: 6px; + text-align: center; + transition-duration: 100ms; } + +.login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item, .login-dialog-not-listed-button, .unlock-dialog .button, +.unlock-dialog .icon-button, +.unlock-dialog .message .message-header .message-expand-button, +.message .message-header .unlock-dialog .message-expand-button, +.unlock-dialog .message .message-header .message-close-button, +.message .message-header .unlock-dialog .message-close-button, +.unlock-dialog .screenshot-ui-show-pointer-button, #LookingGlassDialog .notebook-tab, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button, #LookingGlassDebugFlags .lg-debug-flag-button, #LookingGlassPropertyInspector .lg-obj-inspector-close-button, +#LookingGlassPropertyInspector .lg-obj-inspector-button, #LookingGlassDialog > #Toolbar .lg-toolbar-button, .icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .message .message-header .message-expand-button, +.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button, .button { + border-radius: 8px; + padding: 3px 24px; + font-weight: bold; + transition: border-width 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94), box-shadow 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94); } + +.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .screenshot-ui-show-pointer-button, .message .message-header .message-expand-button, +.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button, .button { + color: #ffffff; - background-color: st-mix(#ffffff, #353535, 9%); } ++ background-color: st-mix(#ffffff, #36363a, 9%); } + .icon-button:focus, .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus, .screenshot-ui-show-pointer-button:focus, .message .message-header .message-expand-button:focus, + .message .message-header .message-close-button:focus, .calendar .calendar-month-header .pager-button:focus, .button:focus { + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 9%), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#ffffff, #36363a, 9%), 5%); } + .icon-button:focus:hover, .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .message .message-header .message-expand-button:focus:hover, + .message .message-header .message-close-button:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .button:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 4%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #36363a, 9%), 4%), 5%); } + .icon-button:hover, .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover, .screenshot-ui-show-pointer-button:hover, .message .message-header .message-expand-button:hover, + .message .message-header .message-close-button:hover, .calendar .calendar-month-header .pager-button:hover, .button:hover { + color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 4%); } ++ background-color: st-lighten(st-mix(#ffffff, #36363a, 9%), 4%); } + .icon-button:insensitive, .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive, .screenshot-ui-show-pointer-button:insensitive, .message .message-header .message-expand-button:insensitive, + .message .message-header .message-close-button:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .button:insensitive { + color: st-transparentize(#ffffff, 0.5); - background-color: st-darken(st-mix(#ffffff, #353535, 9%), 3%); } ++ background-color: st-darken(st-mix(#ffffff, #36363a, 9%), 3%); } + .icon-button:selected, .login-dialog-button.cancel-button:selected, .login-dialog-button.switch-user-button:selected, .login-dialog-button.login-dialog-session-list-button:selected, .screenshot-ui-show-pointer-button:selected, .message .message-header .message-expand-button:selected, + .message .message-header .message-close-button:selected, .calendar .calendar-month-header .pager-button:selected, .button:selected, .icon-button:active, .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active, .screenshot-ui-show-pointer-button:active, .message .message-header .message-expand-button:active, + .message .message-header .message-close-button:active, .calendar .calendar-month-header .pager-button:active, .button:active { + color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 9%); } ++ background-color: st-lighten(st-mix(#ffffff, #36363a, 9%), 9%); } + .icon-button:selected:hover, .login-dialog-button.cancel-button:selected:hover, .login-dialog-button.switch-user-button:selected:hover, .login-dialog-button.login-dialog-session-list-button:selected:hover, .screenshot-ui-show-pointer-button:selected:hover, .message .message-header .message-expand-button:selected:hover, + .message .message-header .message-close-button:selected:hover, .calendar .calendar-month-header .pager-button:selected:hover, .button:selected:hover, .icon-button:active:hover, .login-dialog-button.cancel-button:active:hover, .login-dialog-button.switch-user-button:active:hover, .login-dialog-button.login-dialog-session-list-button:active:hover, .screenshot-ui-show-pointer-button:active:hover, .message .message-header .message-expand-button:active:hover, + .message .message-header .message-close-button:active:hover, .calendar .calendar-month-header .pager-button:active:hover, .button:active:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 9%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 9%), 4%); } + .icon-button:selected:focus, .login-dialog-button.cancel-button:selected:focus, .login-dialog-button.switch-user-button:selected:focus, .login-dialog-button.login-dialog-session-list-button:selected:focus, .screenshot-ui-show-pointer-button:selected:focus, .message .message-header .message-expand-button:selected:focus, + .message .message-header .message-close-button:selected:focus, .calendar .calendar-month-header .pager-button:selected:focus, .button:selected:focus, .icon-button:active:focus, .login-dialog-button.cancel-button:active:focus, .login-dialog-button.switch-user-button:active:focus, .login-dialog-button.login-dialog-session-list-button:active:focus, .screenshot-ui-show-pointer-button:active:focus, .message .message-header .message-expand-button:active:focus, + .message .message-header .message-close-button:active:focus, .calendar .calendar-month-header .pager-button:active:focus, .button:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #36363a, 9%), 9%), 5%); } + .icon-button:checked, .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked, .screenshot-ui-show-pointer-button:checked, .message .message-header .message-expand-button:checked, + .message .message-header .message-close-button:checked, .calendar .calendar-month-header .pager-button:checked, .button:checked { + color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 8%); } ++ background-color: st-lighten(st-mix(#ffffff, #36363a, 9%), 8%); } + .icon-button:checked:hover, .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .message .message-header .message-expand-button:checked:hover, + .message .message-header .message-close-button:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .button:checked:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 8%), 4%); } + .icon-button:checked:active, .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active, .screenshot-ui-show-pointer-button:checked:active, .message .message-header .message-expand-button:checked:active, + .message .message-header .message-close-button:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .button:checked:active { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 9%); } ++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 8%), 9%); } + +.calendar .calendar-day-heading, .calendar .calendar-day, .calendar .calendar-month-header .calendar-month-label, .icon-button.flat, .flat.login-dialog-button.cancel-button, .flat.login-dialog-button.switch-user-button, .flat.login-dialog-button.login-dialog-session-list-button, .flat.screenshot-ui-show-pointer-button, .message .message-header .flat.message-expand-button, +.message .message-header .flat.message-close-button, .calendar .calendar-month-header .pager-button, .button.flat { + color: #ffffff; - background-color: #353535; } ++ background-color: #36363a; } + .calendar .calendar-day-heading:focus, .calendar .calendar-day:focus, .calendar .calendar-month-header .calendar-month-label:focus, .icon-button.flat:focus, .flat.login-dialog-button.cancel-button:focus, .flat.login-dialog-button.switch-user-button:focus, .flat.login-dialog-button.login-dialog-session-list-button:focus, .flat.screenshot-ui-show-pointer-button:focus, .message .message-header .flat.message-expand-button:focus, + .message .message-header .flat.message-close-button:focus, .calendar .calendar-month-header .pager-button:focus, .button.flat:focus { + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(54, 54, 58, 0.25), 5%); } + .calendar .calendar-day-heading:focus:hover, .calendar .calendar-day:focus:hover, .calendar .calendar-month-header .calendar-month-label:focus:hover, .icon-button.flat:focus:hover, .flat.login-dialog-button.cancel-button:focus:hover, .flat.login-dialog-button.switch-user-button:focus:hover, .flat.login-dialog-button.login-dialog-session-list-button:focus:hover, .flat.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .flat.message-expand-button:focus:hover, + .message .message-header .flat.message-close-button:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .button.flat:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#36363a, 7%), 5%); } + .calendar .calendar-day-heading:hover, .calendar .calendar-day:hover, .calendar .calendar-month-header .calendar-month-label:hover, .icon-button.flat:hover, .flat.login-dialog-button.cancel-button:hover, .flat.login-dialog-button.switch-user-button:hover, .flat.login-dialog-button.login-dialog-session-list-button:hover, .flat.screenshot-ui-show-pointer-button:hover, .message .message-header .flat.message-expand-button:hover, + .message .message-header .flat.message-close-button:hover, .calendar .calendar-month-header .pager-button:hover, .button.flat:hover { + color: #ffffff; - background-color: st-lighten(#353535, 7%); } ++ background-color: st-lighten(#36363a, 7%); } + .calendar .calendar-day-heading:insensitive, .calendar .calendar-day:insensitive, .calendar .calendar-month-header .calendar-month-label:insensitive, .icon-button.flat:insensitive, .flat.login-dialog-button.cancel-button:insensitive, .flat.login-dialog-button.switch-user-button:insensitive, .flat.login-dialog-button.login-dialog-session-list-button:insensitive, .flat.screenshot-ui-show-pointer-button:insensitive, .message .message-header .flat.message-expand-button:insensitive, + .message .message-header .flat.message-close-button:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .button.flat:insensitive { + color: st-transparentize(#ffffff, 0.5); - background-color: #353535; } ++ background-color: #36363a; } + .calendar .calendar-day-heading:selected, .calendar .calendar-day:selected, .calendar .calendar-month-header .calendar-month-label:selected, .icon-button.flat:selected, .flat.login-dialog-button.cancel-button:selected, .flat.login-dialog-button.switch-user-button:selected, .flat.login-dialog-button.login-dialog-session-list-button:selected, .flat.screenshot-ui-show-pointer-button:selected, .message .message-header .flat.message-expand-button:selected, + .message .message-header .flat.message-close-button:selected, .calendar .calendar-month-header .pager-button:selected, .button.flat:selected, .calendar .calendar-day-heading:active, .calendar .calendar-day:active, .calendar .calendar-month-header .calendar-month-label:active, .icon-button.flat:active, .flat.login-dialog-button.cancel-button:active, .flat.login-dialog-button.switch-user-button:active, .flat.login-dialog-button.login-dialog-session-list-button:active, .flat.screenshot-ui-show-pointer-button:active, .message .message-header .flat.message-expand-button:active, + .message .message-header .flat.message-close-button:active, .calendar .calendar-month-header .pager-button:active, .button.flat:active { + color: #ffffff; - background-color: st-lighten(#353535, 9%); } ++ background-color: st-lighten(#36363a, 9%); } + .calendar .calendar-day-heading:selected:hover, .calendar .calendar-day:selected:hover, .calendar .calendar-month-header .calendar-month-label:selected:hover, .icon-button.flat:selected:hover, .flat.login-dialog-button.cancel-button:selected:hover, .flat.login-dialog-button.switch-user-button:selected:hover, .flat.login-dialog-button.login-dialog-session-list-button:selected:hover, .flat.screenshot-ui-show-pointer-button:selected:hover, .message .message-header .flat.message-expand-button:selected:hover, + .message .message-header .flat.message-close-button:selected:hover, .calendar .calendar-month-header .pager-button:selected:hover, .button.flat:selected:hover, .calendar .calendar-day-heading:active:hover, .calendar .calendar-day:active:hover, .calendar .calendar-month-header .calendar-month-label:active:hover, .icon-button.flat:active:hover, .flat.login-dialog-button.cancel-button:active:hover, .flat.login-dialog-button.switch-user-button:active:hover, .flat.login-dialog-button.login-dialog-session-list-button:active:hover, .flat.screenshot-ui-show-pointer-button:active:hover, .message .message-header .flat.message-expand-button:active:hover, + .message .message-header .flat.message-close-button:active:hover, .calendar .calendar-month-header .pager-button:active:hover, .button.flat:active:hover { - background-color: st-lighten(st-lighten(#353535, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#36363a, 9%), 7%); } + .calendar .calendar-day-heading:selected:focus, .calendar .calendar-day:selected:focus, .calendar .calendar-month-header .calendar-month-label:selected:focus, .icon-button.flat:selected:focus, .flat.login-dialog-button.cancel-button:selected:focus, .flat.login-dialog-button.switch-user-button:selected:focus, .flat.login-dialog-button.login-dialog-session-list-button:selected:focus, .flat.screenshot-ui-show-pointer-button:selected:focus, .message .message-header .flat.message-expand-button:selected:focus, + .message .message-header .flat.message-close-button:selected:focus, .calendar .calendar-month-header .pager-button:selected:focus, .button.flat:selected:focus, .calendar .calendar-day-heading:active:focus, .calendar .calendar-day:active:focus, .calendar .calendar-month-header .calendar-month-label:active:focus, .icon-button.flat:active:focus, .flat.login-dialog-button.cancel-button:active:focus, .flat.login-dialog-button.switch-user-button:active:focus, .flat.login-dialog-button.login-dialog-session-list-button:active:focus, .flat.screenshot-ui-show-pointer-button:active:focus, .message .message-header .flat.message-expand-button:active:focus, + .message .message-header .flat.message-close-button:active:focus, .calendar .calendar-month-header .pager-button:active:focus, .button.flat:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#36363a, 9%), 5%); } + .calendar .calendar-day-heading:checked, .calendar .calendar-day:checked, .calendar .calendar-month-header .calendar-month-label:checked, .icon-button.flat:checked, .flat.login-dialog-button.cancel-button:checked, .flat.login-dialog-button.switch-user-button:checked, .flat.login-dialog-button.login-dialog-session-list-button:checked, .flat.screenshot-ui-show-pointer-button:checked, .message .message-header .flat.message-expand-button:checked, + .message .message-header .flat.message-close-button:checked, .calendar .calendar-month-header .pager-button:checked, .button.flat:checked { + color: #ffffff; - background-color: st-lighten(#353535, 8%); } ++ background-color: st-lighten(#36363a, 8%); } + .calendar .calendar-day-heading:checked:hover, .calendar .calendar-day:checked:hover, .calendar .calendar-month-header .calendar-month-label:checked:hover, .icon-button.flat:checked:hover, .flat.login-dialog-button.cancel-button:checked:hover, .flat.login-dialog-button.switch-user-button:checked:hover, .flat.login-dialog-button.login-dialog-session-list-button:checked:hover, .flat.screenshot-ui-show-pointer-button:checked:hover, .message .message-header .flat.message-expand-button:checked:hover, + .message .message-header .flat.message-close-button:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .button.flat:checked:hover { - background-color: st-lighten(st-lighten(#353535, 8%), 7%); } ++ background-color: st-lighten(st-lighten(#36363a, 8%), 7%); } + .calendar .calendar-day-heading:checked:active, .calendar .calendar-day:checked:active, .calendar .calendar-month-header .calendar-month-label:checked:active, .icon-button.flat:checked:active, .flat.login-dialog-button.cancel-button:checked:active, .flat.login-dialog-button.switch-user-button:checked:active, .flat.login-dialog-button.login-dialog-session-list-button:checked:active, .flat.screenshot-ui-show-pointer-button:checked:active, .message .message-header .flat.message-expand-button:checked:active, + .message .message-header .flat.message-close-button:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .button.flat:checked:active { - background-color: st-lighten(st-lighten(#353535, 8%), 9%); } ++ background-color: st-lighten(st-lighten(#36363a, 8%), 9%); } + - .keyboard-brightness-level .button:checked, .quick-menu-toggle .quick-toggle-arrow:checked, .quick-toggle:checked, .calendar .calendar-day.calendar-today, .icon-button.default, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .default.screenshot-ui-show-pointer-button, .message .message-header .default.message-expand-button, ++.keyboard-brightness-level .button:checked, .quick-toggle:checked, .calendar .calendar-day.calendar-today, .icon-button.default, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .default.screenshot-ui-show-pointer-button, .message .message-header .default.message-expand-button, +.message .message-header .default.message-close-button, .calendar .calendar-month-header .default.pager-button, .button.default { + color: -st-accent-fg-color; + background-color: -st-accent-color; } - .keyboard-brightness-level .button:focus:checked, .quick-menu-toggle .quick-toggle-arrow:focus:checked, .quick-toggle:focus:checked, .calendar .calendar-day.calendar-today:focus, .icon-button.default:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .default.screenshot-ui-show-pointer-button:focus, .message .message-header .default.message-expand-button:focus, ++ .keyboard-brightness-level .button:focus:checked, .quick-toggle:focus:checked, .calendar .calendar-day.calendar-today:focus, .icon-button.default:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .default.screenshot-ui-show-pointer-button:focus, .message .message-header .default.message-expand-button:focus, + .message .message-header .default.message-close-button:focus, .calendar .calendar-month-header .default.pager-button:focus, .button.default:focus { + color: -st-accent-fg-color; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - box-shadow: inset 0 0 0 2px st-lighten(-st-accent-color, 15%) !important; - background-color: st-mix(-st-accent-color, -st-accent-color, 5%); } - .keyboard-brightness-level .button:focus:hover:checked, .quick-menu-toggle .quick-toggle-arrow:focus:hover:checked, .quick-toggle:focus:hover:checked, .calendar .calendar-day.calendar-today:focus:hover, .icon-button.default:focus:hover, .default.login-dialog-button.cancel-button:focus:hover, .default.login-dialog-button.switch-user-button:focus:hover, .default.login-dialog-button.login-dialog-session-list-button:focus:hover, .default.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .default.message-expand-button:focus:hover, ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ box-shadow: inset 0 0 0 2px st-transparentize(st-lighten(-st-accent-color, 30%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), -st-accent-color, 5%); } ++ .keyboard-brightness-level .button:focus:hover:checked, .quick-toggle:focus:hover:checked, .calendar .calendar-day.calendar-today:focus:hover, .icon-button.default:focus:hover, .default.login-dialog-button.cancel-button:focus:hover, .default.login-dialog-button.switch-user-button:focus:hover, .default.login-dialog-button.login-dialog-session-list-button:focus:hover, .default.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .default.message-expand-button:focus:hover, + .message .message-header .default.message-close-button:focus:hover, .calendar .calendar-month-header .default.pager-button:focus:hover, .button.default:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(-st-accent-color, 4%), 5%); } - .keyboard-brightness-level .button:hover:checked, .quick-menu-toggle .quick-toggle-arrow:hover:checked, .quick-toggle:hover:checked, .calendar .calendar-day.calendar-today:hover, .icon-button.default:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .default.screenshot-ui-show-pointer-button:hover, .message .message-header .default.message-expand-button:hover, ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(-st-accent-color, 4%), 5%); } ++ .keyboard-brightness-level .button:hover:checked, .quick-toggle:hover:checked, .calendar .calendar-day.calendar-today:hover, .icon-button.default:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .default.screenshot-ui-show-pointer-button:hover, .message .message-header .default.message-expand-button:hover, + .message .message-header .default.message-close-button:hover, .calendar .calendar-month-header .default.pager-button:hover, .button.default:hover { + color: -st-accent-fg-color; + background-color: st-lighten(-st-accent-color, 4%); } - .keyboard-brightness-level .button:insensitive:checked, .quick-menu-toggle .quick-toggle-arrow:insensitive:checked, .quick-toggle:insensitive:checked, .calendar .calendar-day.calendar-today:insensitive, .icon-button.default:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .default.screenshot-ui-show-pointer-button:insensitive, .message .message-header .default.message-expand-button:insensitive, ++ .keyboard-brightness-level .button:insensitive:checked, .quick-toggle:insensitive:checked, .calendar .calendar-day.calendar-today:insensitive, .icon-button.default:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .default.screenshot-ui-show-pointer-button:insensitive, .message .message-header .default.message-expand-button:insensitive, + .message .message-header .default.message-close-button:insensitive, .calendar .calendar-month-header .default.pager-button:insensitive, .button.default:insensitive { + color: st-transparentize(-st-accent-fg-color, 0.5); + background-color: st-darken(-st-accent-color, 3%); } - .keyboard-brightness-level .button:active:checked, .quick-menu-toggle .quick-toggle-arrow:active:checked, .quick-toggle:active:checked, .calendar .calendar-day.calendar-today:active, .icon-button.default:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .default.screenshot-ui-show-pointer-button:active, .message .message-header .default.message-expand-button:active, ++ .keyboard-brightness-level .button:active:checked, .quick-toggle:active:checked, .calendar .calendar-day.calendar-today:active, .icon-button.default:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .default.screenshot-ui-show-pointer-button:active, .message .message-header .default.message-expand-button:active, + .message .message-header .default.message-close-button:active, .calendar .calendar-month-header .default.pager-button:active, .button.default:active { + color: -st-accent-fg-color; + background-color: st-lighten(-st-accent-color, 9%); } - .keyboard-brightness-level .button:active:hover:checked, .quick-menu-toggle .quick-toggle-arrow:active:hover:checked, .quick-toggle:active:hover:checked, .calendar .calendar-day.calendar-today:active:hover, .icon-button.default:active:hover, .default.login-dialog-button.cancel-button:active:hover, .default.login-dialog-button.switch-user-button:active:hover, .default.login-dialog-button.login-dialog-session-list-button:active:hover, .default.screenshot-ui-show-pointer-button:active:hover, .message .message-header .default.message-expand-button:active:hover, ++ .keyboard-brightness-level .button:active:hover:checked, .quick-toggle:active:hover:checked, .calendar .calendar-day.calendar-today:active:hover, .icon-button.default:active:hover, .default.login-dialog-button.cancel-button:active:hover, .default.login-dialog-button.switch-user-button:active:hover, .default.login-dialog-button.login-dialog-session-list-button:active:hover, .default.screenshot-ui-show-pointer-button:active:hover, .message .message-header .default.message-expand-button:active:hover, + .message .message-header .default.message-close-button:active:hover, .calendar .calendar-month-header .default.pager-button:active:hover, .button.default:active:hover { + background-color: st-lighten(st-lighten(-st-accent-color, 9%), 4%); } - .keyboard-brightness-level .button:active:focus:checked, .quick-menu-toggle .quick-toggle-arrow:active:focus:checked, .quick-toggle:active:focus:checked, .calendar .calendar-day.calendar-today:active:focus, .icon-button.default:active:focus, .default.login-dialog-button.cancel-button:active:focus, .default.login-dialog-button.switch-user-button:active:focus, .default.login-dialog-button.login-dialog-session-list-button:active:focus, .default.screenshot-ui-show-pointer-button:active:focus, .message .message-header .default.message-expand-button:active:focus, ++ .keyboard-brightness-level .button:active:focus:checked, .quick-toggle:active:focus:checked, .calendar .calendar-day.calendar-today:active:focus, .icon-button.default:active:focus, .default.login-dialog-button.cancel-button:active:focus, .default.login-dialog-button.switch-user-button:active:focus, .default.login-dialog-button.login-dialog-session-list-button:active:focus, .default.screenshot-ui-show-pointer-button:active:focus, .message .message-header .default.message-expand-button:active:focus, + .message .message-header .default.message-close-button:active:focus, .calendar .calendar-month-header .default.pager-button:active:focus, .button.default:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(-st-accent-color, 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(-st-accent-color, 9%), 5%); } + +.popup-sub-menu .popup-menu-item, .popup-menu-item { + font-weight: normal; + spacing: 6px; + transition-duration: 100ms; + padding: 9px 12px; } + +#LookingGlassExtensions .lg-extension, #LookingGlassWindows .lg-window, .calendar, .datemenu-today-button, .quick-toggle-menu, .message, .events-button, +.world-clocks-button, +.weather-button { + border-radius: 12px; + padding: 0.818em; + margin: 4px; - background-color: #474747; ++ background-color: #47474c; + box-shadow: 0 1px 2px 0 transparent; + border: 1px solid transparent; } + +.quick-toggle-menu, .message, .events-button, +.world-clocks-button, +.weather-button { + color: #ffffff; - background-color: #474747; } ++ background-color: #47474c; } + .quick-toggle-menu:hover, .message:hover, .events-button:hover, + .world-clocks-button:hover, + .weather-button:hover { + color: #ffffff; - background-color: st-lighten(#474747, 4%); } ++ background-color: st-lighten(#47474c, 4%); } + .quick-toggle-menu:active, .message:active, .events-button:active, + .world-clocks-button:active, + .weather-button:active { + color: #ffffff; - background-color: st-lighten(#474747, 9%); } ++ background-color: st-lighten(#47474c, 9%); } + .quick-toggle-menu:active:hover, .message:active:hover, .events-button:active:hover, + .world-clocks-button:active:hover, + .weather-button:active:hover { - background-color: st-lighten(st-lighten(#474747, 9%), 4%); } ++ background-color: st-lighten(st-lighten(#47474c, 9%), 4%); } + .quick-toggle-menu:active:focus, .message:active:focus, .events-button:active:focus, + .world-clocks-button:active:focus, + .weather-button:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#474747, 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#47474c, 9%), 5%); } + .quick-toggle-menu:focus, .message:focus, .events-button:focus, + .world-clocks-button:focus, + .weather-button:focus { + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, #474747, 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #47474c, 5%); } + .quick-toggle-menu:focus:hover, .message:focus:hover, .events-button:focus:hover, + .world-clocks-button:focus:hover, + .weather-button:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(#474747, 4%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#47474c, 4%), 5%); } + .quick-toggle-menu:insensitive, .message:insensitive, .events-button:insensitive, + .world-clocks-button:insensitive, + .weather-button:insensitive { + color: st-transparentize(#ffffff, 0.5); - background-color: st-darken(#474747, 3%); } ++ background-color: st-darken(#47474c, 3%); } + +.calendar, .datemenu-today-button { + border: 1px solid transparent !important; + background-color: transparent; + border-color: transparent; + box-shadow: none; } + .calendar:insensitive, .datemenu-today-button:insensitive { + background-color: transparent !important; } + .calendar:hover, .datemenu-today-button:hover { + color: #ffffff; - background-color: st-lighten(#353535, 7%); } ++ background-color: st-lighten(#36363a, 7%); } + .calendar:active, .datemenu-today-button:active { + color: #ffffff; - background-color: st-lighten(#353535, 9%); } ++ background-color: st-lighten(#36363a, 9%); } + .calendar:active:hover, .datemenu-today-button:active:hover { - background-color: st-lighten(st-lighten(#353535, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#36363a, 9%), 7%); } + .calendar:active:focus, .datemenu-today-button:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#36363a, 9%), 5%); } + .calendar:focus, .datemenu-today-button:focus { + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, #474747, 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #47474c, 5%); } + .calendar:focus:hover, .datemenu-today-button:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(#474747, 4%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#47474c, 4%), 5%); } + .calendar:insensitive, .datemenu-today-button:insensitive { + color: st-transparentize(#ffffff, 0.5); - background-color: st-darken(#474747, 3%); } ++ background-color: st-darken(#47474c, 3%); } + +.unlock-dialog .login-dialog-prompt-entry, .login-dialog .login-dialog-prompt-entry, .app-folder-dialog .folder-name-container .folder-name-entry, .search-entry, .lg-dialog StEntry, StEntry { + border-radius: 8px; + padding: 9px 9px; + selection-background-color: st-transparentize(-st-accent-color, 0.7); + selected-color: #ffffff; } + +StEntry { - background-color: #474747; ++ background-color: #48484c; + color: rgba(255, 255, 255, 0.7); } + StEntry:hover { - background-color: #515151; ++ background-color: #525256; + color: #ffffff; } + StEntry:focus { - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, #474747, 5%); ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #48484c, 5%); + color: #ffffff; } + StEntry:insensitive { - background-color: #3f3f3f; ++ background-color: #414144; + color: rgba(255, 255, 255, 0.5); } + StEntry StLabel.hint-text { + color: rgba(255, 255, 255, 0.7); } + +.notification-button, .message .message-header .message-expand-button, +.message .message-header .message-close-button { + font-weight: bold; + padding: 6px 12px; + border-radius: 8px; + color: #ffffff; + background-color: rgba(255, 255, 255, 0.15); } + .notification-button:focus, .message .message-header .message-expand-button:focus, + .message .message-header .message-close-button:focus { + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.15), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.15), 5%); } + .notification-button:focus:hover, .message .message-header .message-expand-button:focus:hover, + .message .message-header .message-close-button:focus:hover { - background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.3), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.3), 5%); } + .notification-button:hover, .message .message-header .message-expand-button:hover, + .message .message-header .message-close-button:hover { + color: #ffffff; + background-color: rgba(255, 255, 255, 0.3); } + .notification-button:active, .message .message-header .message-expand-button:active, + .message .message-header .message-close-button:active { + color: #ffffff; + background-color: rgba(255, 255, 255, 0.2); } + .notification-button:active:hover, .message .message-header .message-expand-button:active:hover, + .message .message-header .message-close-button:active:hover { + background-color: rgba(255, 255, 255, 0.2); } + .notification-button:active:focus, .message .message-header .message-expand-button:active:focus, + .message .message-header .message-close-button:active:focus { - background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.2), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.2), 5%); } + .notification-button:checked, .message .message-header .message-expand-button:checked, + .message .message-header .message-close-button:checked { + color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 8%); } ++ background-color: st-lighten(st-mix(#ffffff, #36363a, 9%), 8%); } + .notification-button:checked:hover, .message .message-header .message-expand-button:checked:hover, + .message .message-header .message-close-button:checked:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 8%), 4%); } + .notification-button:checked:active, .message .message-header .message-expand-button:checked:active, + .message .message-header .message-close-button:checked:active { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 9%); } ++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 8%), 9%); } + .notification-button:insensitive, .message .message-header .message-expand-button:insensitive, + .message .message-header .message-close-button:insensitive { + color: st-transparentize(#ffffff, 0.5); + background-color: rgba(255, 255, 255, 0.1); } + +.modal-dialog .modal-dialog-button-box .modal-dialog-button { + font-weight: bold; + padding: 12px; + border-radius: 12px; + color: #ffffff; + background-color: rgba(255, 255, 255, 0.1); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:focus { + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.1), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.1), 5%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:focus:hover { - background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.13), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.13), 5%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:hover { + color: #ffffff; + background-color: rgba(255, 255, 255, 0.13); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:active { + color: #ffffff; + background-color: rgba(255, 255, 255, 0.16); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:active:hover { + background-color: rgba(255, 255, 255, 0.19); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:active:focus { - background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.16), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.16), 5%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked { + color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 8%); } ++ background-color: st-lighten(st-mix(#ffffff, #36363a, 9%), 8%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 8%), 4%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked:active { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 9%); } ++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 8%), 9%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:insensitive { + color: st-transparentize(#ffffff, 0.5); - background-color: st-darken(st-mix(#ffffff, #353535, 9%), 3%); } ++ background-color: st-darken(st-mix(#ffffff, #36363a, 9%), 3%); } + +.dash-label, .window-caption, .screenshot-ui-tooltip { + background-color: rgba(0, 0, 0, 0.9); + border: 1px solid rgba(255, 255, 255, 0.1); + color: #ffffff; + border-radius: 999px; + padding: 6px 12px; + text-align: center; } + +/* General Typography */ +.unlock-dialog-clock .unlock-dialog-clock-date, .app-folder-dialog .folder-name-container .folder-name-label, .app-folder-dialog .folder-name-container .folder-name-entry, .search-statustext { + font-weight: 800; + font-size: 1.818em; } + - .conflicting-session-dialog-content .conflicting-session-dialog-title, .message-dialog-content .message-dialog-title, .message-list .message-list-placeholder, .datemenu-today-button .date-label { ++.conflicting-session-dialog-content .conflicting-session-dialog-title, .message-dialog-content .message-dialog-title, .datemenu-today-button .date-label { + font-weight: 800; + font-size: 1.364em; } + +.login-dialog .user-widget.horizontal .user-widget-label, - .unlock-dialog .user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title { ++.unlock-dialog .user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title, .message-list .message-list-placeholder { + font-weight: 700; + font-size: 1.364em; } + +.login-dialog-auth-list-label, #LookingGlassDebugFlags .lg-debug-flags-header, #LookingGlassExtensions .lg-extensions-none, .word-suggestions, .bt-menu-placeholder.popup-menu-item, .restart-message, .polkit-dialog-user-layout .polkit-dialog-user-label, +.polkit-dialog-user-layout .polkit-dialog-user-root-label, .message-dialog-content .message-dialog-title.lightweight { + font-weight: 700; + font-size: 1.182em; } + - .login-dialog-not-listed-label, #LookingGlassExtensions .lg-extension .lg-extension-name, #LookingGlassWindows .lg-window .lg-window-name, #LookingGlassPropertyInspector .lg-obj-inspector-title, .background-app-item .title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-box .weather-header-box .weather-header, .world-clocks-button .world-clocks-header, .events-button .events-box .events-list .event-box .event-summary, .events-button .events-box .events-title, .calendar .calendar-month-header .calendar-month-label { ++.login-dialog-not-listed-label, #LookingGlassExtensions .lg-extension .lg-extension-name, #LookingGlassWindows .lg-window .lg-window-name, #LookingGlassPropertyInspector .lg-obj-inspector-title, .background-app-item .title, .quick-toggle .quick-toggle-title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-box .weather-header-box .weather-header, .world-clocks-button .world-clocks-header, .events-button .events-box .events-list .event-box .event-summary, .events-button .events-box .events-title, .calendar .calendar-month-header .calendar-month-label { + font-weight: 700; + font-size: 1em; } + +.quick-toggle-menu .header .subtitle, .app-menu .popup-inactive-menu-item:first-child > StLabel { + font-weight: 700; + font-size: 0.818em; } + - .lg-completions-text, .caps-lock-warning-label, .background-app-item .subtitle, .quick-toggle StBoxLayout > .quick-toggle-subtitle, .screenshot-ui-type-button .icon-label-button-container, .prompt-dialog .prompt-dialog-error-label, ++.lg-completions-text, .caps-lock-warning-label, .background-app-item .subtitle, .quick-toggle .quick-toggle-subtitle, .screenshot-ui-type-button .icon-label-button-container, .prompt-dialog .prompt-dialog-error-label, +.prompt-dialog .prompt-dialog-info-label, +.prompt-dialog .prompt-dialog-null-label, .run-dialog .run-dialog-description, .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description, .message .message-header .message-header-content .event-time, .world-clocks-button .world-clocks-grid .world-clocks-timezone, .events-button .events-box .events-list .event-box .event-time { + font-weight: 400; + font-size: 0.818em; } + +.weather-button .weather-box .weather-grid .weather-forecast-time, .calendar .calendar-week-number, .calendar .calendar-day-heading, .calendar .calendar-day { + font-weight: 400; + font-size: 0.818em; } + +#LookingGlassDebugFlags .lg-debug-flag-button StLabel, #LookingGlassEvaluator .evaluator-results, .lg-dialog .actor-link { + font-family: monospace; } + +.unlock-dialog-clock .unlock-dialog-clock-time, #panel, .weather-button .weather-box .weather-grid .weather-forecast-temp, .world-clocks-button .world-clocks-grid .world-clocks-timezone, .world-clocks-button .world-clocks-grid .world-clocks-time, .events-button .events-box .events-list .event-box .event-time, .calendar .calendar-day-heading, .calendar .calendar-day { + font-feature-settings: "tnum"; } + +/* OSD Elements */ +#LookingGlassDialog, .screenshot-ui-panel, .workspace-switcher, .switcher-list, .resize-popup, .osd-window { + color: #ffffff; - background-color: #353535; ++ background-color: #2e2e33; + border: 1px solid rgba(255, 255, 255, 0.02); + border-radius: 999px; + padding: 12px; } + +.lg-dialog StEntry { - background-color: #474747; ++ background-color: #414146; + color: rgba(255, 255, 255, 0.7); } + .lg-dialog StEntry:hover { - background-color: #515151; ++ background-color: #4b4b51; + color: #ffffff; } + .lg-dialog StEntry:focus { - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, #474747, 5%); ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #414146, 5%); + color: #ffffff; } + .lg-dialog StEntry:insensitive { - background-color: #3f3f3f; ++ background-color: #3a3a3e; + color: rgba(255, 255, 255, 0.5); } + .lg-dialog StEntry StLabel.hint-text { + color: rgba(255, 255, 255, 0.7); } + +#LookingGlassDebugFlags .lg-debug-flag-button, #LookingGlassPropertyInspector .lg-obj-inspector-close-button, +#LookingGlassPropertyInspector .lg-obj-inspector-button, #LookingGlassDialog > #Toolbar .lg-toolbar-button { + color: #ffffff; - background-color: st-mix(#ffffff, #353535, 9%); } ++ background-color: st-mix(#ffffff, #2e2e33, 9%); } + #LookingGlassDebugFlags .lg-debug-flag-button:focus, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:focus, + #LookingGlassPropertyInspector .lg-obj-inspector-button:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus { + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 9%), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#ffffff, #2e2e33, 9%), 5%); } + #LookingGlassDebugFlags .lg-debug-flag-button:focus:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:focus:hover, + #LookingGlassPropertyInspector .lg-obj-inspector-button:focus:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 4%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #2e2e33, 9%), 4%), 5%); } + #LookingGlassDebugFlags .lg-debug-flag-button:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:hover, + #LookingGlassPropertyInspector .lg-obj-inspector-button:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:hover { + color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 4%); } ++ background-color: st-lighten(st-mix(#ffffff, #2e2e33, 9%), 4%); } + #LookingGlassDebugFlags .lg-debug-flag-button:active, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active, + #LookingGlassPropertyInspector .lg-obj-inspector-button:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active { + color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 9%); } ++ background-color: st-lighten(st-mix(#ffffff, #2e2e33, 9%), 9%); } + #LookingGlassDebugFlags .lg-debug-flag-button:active:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active:hover, + #LookingGlassPropertyInspector .lg-obj-inspector-button:active:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 9%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 9%), 9%), 4%); } + #LookingGlassDebugFlags .lg-debug-flag-button:active:focus, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active:focus, + #LookingGlassPropertyInspector .lg-obj-inspector-button:active:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #2e2e33, 9%), 9%), 5%); } + #LookingGlassDebugFlags .lg-debug-flag-button:checked, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked, + #LookingGlassPropertyInspector .lg-obj-inspector-button:checked, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked { + color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 8%); } ++ background-color: st-lighten(st-mix(#ffffff, #2e2e33, 9%), 8%); } + #LookingGlassDebugFlags .lg-debug-flag-button:checked:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked:hover, + #LookingGlassPropertyInspector .lg-obj-inspector-button:checked:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 9%), 8%), 4%); } + #LookingGlassDebugFlags .lg-debug-flag-button:checked:active, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked:active, + #LookingGlassPropertyInspector .lg-obj-inspector-button:checked:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:active { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 9%); } ++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 9%), 8%), 9%); } + #LookingGlassDebugFlags .lg-debug-flag-button:insensitive, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:insensitive, + #LookingGlassPropertyInspector .lg-obj-inspector-button:insensitive, #LookingGlassDialog > #Toolbar .lg-toolbar-button:insensitive { + color: st-transparentize(#ffffff, 0.5); - background-color: st-darken(st-mix(#ffffff, #353535, 9%), 3%); } ++ background-color: st-darken(st-mix(#ffffff, #2e2e33, 9%), 3%); } + +#LookingGlassDialog .notebook-tab, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button { + color: #ffffff; - background-color: #353535; } ++ background-color: #2e2e33; } + #LookingGlassDialog .notebook-tab:focus, .screenshot-ui-show-pointer-button:focus, .screenshot-ui-type-button:focus { + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(46, 46, 51, 0.25), 5%); } + #LookingGlassDialog .notebook-tab:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .screenshot-ui-type-button:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#2e2e33, 7%), 5%); } + #LookingGlassDialog .notebook-tab:hover, .screenshot-ui-show-pointer-button:hover, .screenshot-ui-type-button:hover { + color: #ffffff; - background-color: st-lighten(#353535, 7%); } ++ background-color: st-lighten(#2e2e33, 7%); } + #LookingGlassDialog .notebook-tab:active, .screenshot-ui-show-pointer-button:active, .screenshot-ui-type-button:active { + color: #ffffff; - background-color: st-lighten(#353535, 9%); } ++ background-color: st-lighten(#2e2e33, 9%); } + #LookingGlassDialog .notebook-tab:active:hover, .screenshot-ui-show-pointer-button:active:hover, .screenshot-ui-type-button:active:hover { - background-color: st-lighten(st-lighten(#353535, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#2e2e33, 9%), 7%); } + #LookingGlassDialog .notebook-tab:active:focus, .screenshot-ui-show-pointer-button:active:focus, .screenshot-ui-type-button:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#2e2e33, 9%), 5%); } + #LookingGlassDialog .notebook-tab:checked, .screenshot-ui-show-pointer-button:checked, .screenshot-ui-type-button:checked { + color: #ffffff; - background-color: st-lighten(#353535, 8%); } ++ background-color: st-lighten(#2e2e33, 8%); } + #LookingGlassDialog .notebook-tab:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .screenshot-ui-type-button:checked:hover { - background-color: st-lighten(st-lighten(#353535, 8%), 7%); } ++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 7%); } + #LookingGlassDialog .notebook-tab:checked:active, .screenshot-ui-show-pointer-button:checked:active, .screenshot-ui-type-button:checked:active { - background-color: st-lighten(st-lighten(#353535, 8%), 9%); } ++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 9%); } + #LookingGlassDialog .notebook-tab:insensitive, .screenshot-ui-show-pointer-button:insensitive, .screenshot-ui-type-button:insensitive { + color: st-transparentize(#ffffff, 0.5); - background-color: #353535; } ++ background-color: #2e2e33; } + +/* System Elements */ +.login-dialog .login-dialog-prompt-entry, .app-folder-dialog .folder-name-container .folder-name-entry, .search-entry { - background-color: #464646; - color: rgba(245, 245, 245, 0.7); } ++ background-color: #404045; ++ color: rgba(250, 250, 251, 0.7); } + .login-dialog .login-dialog-prompt-entry:hover, .app-folder-dialog .folder-name-container .folder-name-entry:hover, .search-entry:hover { - background-color: #505050; - color: whitesmoke; } ++ background-color: #4a4a50; ++ color: #fafafb; } + .login-dialog .login-dialog-prompt-entry:focus, .app-folder-dialog .folder-name-container .folder-name-entry:focus, .search-entry:focus { - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, #464646, 5%); - color: whitesmoke; } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #404045, 5%); ++ color: #fafafb; } + .login-dialog .login-dialog-prompt-entry:insensitive, .app-folder-dialog .folder-name-container .folder-name-entry:insensitive, .search-entry:insensitive { - background-color: #3e3e3e; - color: rgba(245, 245, 245, 0.5); } ++ background-color: #39393d; ++ color: rgba(250, 250, 251, 0.5); } + .login-dialog .login-dialog-prompt-entry StLabel.hint-text, .app-folder-dialog .folder-name-container .folder-name-entry StLabel.hint-text, .search-entry StLabel.hint-text { - color: rgba(245, 245, 245, 0.7); } ++ color: rgba(250, 250, 251, 0.7); } + +.login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button { - color: whitesmoke; - background-color: st-mix(whitesmoke, #353535, 9%); } ++ color: #fafafb; ++ background-color: st-mix(#fafafb, #2e2e33, 9%); } + .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive { - color: st-transparentize(whitesmoke, 0.5); - background-color: st-darken(st-mix(whitesmoke, #353535, 9%), 3%); } ++ color: st-transparentize(#fafafb, 0.5); ++ background-color: st-darken(st-mix(#fafafb, #2e2e33, 9%), 3%); } + .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus { - color: whitesmoke; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, st-mix(whitesmoke, #353535, 9%), 5%); } ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#fafafb, #2e2e33, 9%), 5%); } + .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #353535, 9%), 4%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #2e2e33, 9%), 4%), 5%); } + .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover { - color: whitesmoke; - background-color: st-lighten(st-mix(whitesmoke, #353535, 9%), 4%); } ++ color: #fafafb; ++ background-color: st-lighten(st-mix(#fafafb, #2e2e33, 9%), 4%); } + .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active { - color: whitesmoke; - background-color: st-lighten(st-mix(whitesmoke, #353535, 9%), 9%); } ++ color: #fafafb; ++ background-color: st-lighten(st-mix(#fafafb, #2e2e33, 9%), 9%); } + .login-dialog-button.cancel-button:active:hover, .login-dialog-button.switch-user-button:active:hover, .login-dialog-button.login-dialog-session-list-button:active:hover { - background-color: st-lighten(st-lighten(st-mix(whitesmoke, #353535, 9%), 9%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #2e2e33, 9%), 9%), 4%); } + .login-dialog-button.cancel-button:active:focus, .login-dialog-button.switch-user-button:active:focus, .login-dialog-button.login-dialog-session-list-button:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #353535, 9%), 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #2e2e33, 9%), 9%), 5%); } + .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked { - color: whitesmoke; - background-color: st-lighten(st-mix(whitesmoke, #353535, 9%), 8%); } ++ color: #fafafb; ++ background-color: st-lighten(st-mix(#fafafb, #2e2e33, 9%), 8%); } + .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover { - background-color: st-lighten(st-lighten(st-mix(whitesmoke, #353535, 9%), 8%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #2e2e33, 9%), 8%), 4%); } + .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active { - background-color: st-lighten(st-lighten(st-mix(whitesmoke, #353535, 9%), 8%), 9%); } ++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #2e2e33, 9%), 8%), 9%); } + +/* Lockscreen Elements */ +.unlock-dialog .button, +.unlock-dialog .icon-button, +.unlock-dialog .calendar .calendar-month-header .pager-button, +.calendar .calendar-month-header .unlock-dialog .pager-button, +.unlock-dialog .message .message-header .message-expand-button, +.message .message-header .unlock-dialog .message-expand-button, +.unlock-dialog .message .message-header .message-close-button, +.message .message-header .unlock-dialog .message-close-button, +.unlock-dialog .screenshot-ui-show-pointer-button, +.unlock-dialog .login-dialog-button.cancel-button, +.unlock-dialog .login-dialog-button.switch-user-button, +.unlock-dialog .login-dialog-button.login-dialog-session-list-button { - color: whitesmoke; - background-color: rgba(245, 245, 245, 0.1); } ++ color: #fafafb; ++ background-color: rgba(250, 250, 251, 0.1); } + .unlock-dialog .button:focus, + .unlock-dialog .icon-button:focus, + .unlock-dialog .calendar .calendar-month-header .pager-button:focus, + .calendar .calendar-month-header .unlock-dialog .pager-button:focus, + .unlock-dialog .message .message-header .message-expand-button:focus, + .message .message-header .unlock-dialog .message-expand-button:focus, + .unlock-dialog .message .message-header .message-close-button:focus, + .message .message-header .unlock-dialog .message-close-button:focus, + .unlock-dialog .screenshot-ui-show-pointer-button:focus, + .unlock-dialog .login-dialog-button.cancel-button:focus, + .unlock-dialog .login-dialog-button.switch-user-button:focus, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:focus { - color: whitesmoke; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.1), 5%); } ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(250, 250, 251, 0.1), 5%); } + .unlock-dialog .button:focus:hover, + .unlock-dialog .icon-button:focus:hover, + .unlock-dialog .calendar .calendar-month-header .pager-button:focus:hover, + .calendar .calendar-month-header .unlock-dialog .pager-button:focus:hover, + .unlock-dialog .message .message-header .message-expand-button:focus:hover, + .message .message-header .unlock-dialog .message-expand-button:focus:hover, + .unlock-dialog .message .message-header .message-close-button:focus:hover, + .message .message-header .unlock-dialog .message-close-button:focus:hover, + .unlock-dialog .screenshot-ui-show-pointer-button:focus:hover, + .unlock-dialog .login-dialog-button.cancel-button:focus:hover, + .unlock-dialog .login-dialog-button.switch-user-button:focus:hover, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:focus:hover { - background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.13), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(250, 250, 251, 0.13), 5%); } + .unlock-dialog .button:hover, + .unlock-dialog .icon-button:hover, + .unlock-dialog .calendar .calendar-month-header .pager-button:hover, + .calendar .calendar-month-header .unlock-dialog .pager-button:hover, + .unlock-dialog .message .message-header .message-expand-button:hover, + .message .message-header .unlock-dialog .message-expand-button:hover, + .unlock-dialog .message .message-header .message-close-button:hover, + .message .message-header .unlock-dialog .message-close-button:hover, + .unlock-dialog .screenshot-ui-show-pointer-button:hover, + .unlock-dialog .login-dialog-button.cancel-button:hover, + .unlock-dialog .login-dialog-button.switch-user-button:hover, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:hover { - color: whitesmoke; - background-color: rgba(245, 245, 245, 0.13); } ++ color: #fafafb; ++ background-color: rgba(250, 250, 251, 0.13); } + .unlock-dialog .button:active, + .unlock-dialog .icon-button:active, + .unlock-dialog .calendar .calendar-month-header .pager-button:active, + .calendar .calendar-month-header .unlock-dialog .pager-button:active, + .unlock-dialog .message .message-header .message-expand-button:active, + .message .message-header .unlock-dialog .message-expand-button:active, + .unlock-dialog .message .message-header .message-close-button:active, + .message .message-header .unlock-dialog .message-close-button:active, + .unlock-dialog .screenshot-ui-show-pointer-button:active, + .unlock-dialog .login-dialog-button.cancel-button:active, + .unlock-dialog .login-dialog-button.switch-user-button:active, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active { - color: whitesmoke; - background-color: rgba(245, 245, 245, 0.16); } ++ color: #fafafb; ++ background-color: rgba(250, 250, 251, 0.16); } + .unlock-dialog .button:active:hover, + .unlock-dialog .icon-button:active:hover, + .unlock-dialog .calendar .calendar-month-header .pager-button:active:hover, + .calendar .calendar-month-header .unlock-dialog .pager-button:active:hover, + .unlock-dialog .message .message-header .message-expand-button:active:hover, + .message .message-header .unlock-dialog .message-expand-button:active:hover, + .unlock-dialog .message .message-header .message-close-button:active:hover, + .message .message-header .unlock-dialog .message-close-button:active:hover, + .unlock-dialog .screenshot-ui-show-pointer-button:active:hover, + .unlock-dialog .login-dialog-button.cancel-button:active:hover, + .unlock-dialog .login-dialog-button.switch-user-button:active:hover, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active:hover { - background-color: rgba(245, 245, 245, 0.19); } ++ background-color: rgba(250, 250, 251, 0.19); } + .unlock-dialog .button:active:focus, + .unlock-dialog .icon-button:active:focus, + .unlock-dialog .calendar .calendar-month-header .pager-button:active:focus, + .calendar .calendar-month-header .unlock-dialog .pager-button:active:focus, + .unlock-dialog .message .message-header .message-expand-button:active:focus, + .message .message-header .unlock-dialog .message-expand-button:active:focus, + .unlock-dialog .message .message-header .message-close-button:active:focus, + .message .message-header .unlock-dialog .message-close-button:active:focus, + .unlock-dialog .screenshot-ui-show-pointer-button:active:focus, + .unlock-dialog .login-dialog-button.cancel-button:active:focus, + .unlock-dialog .login-dialog-button.switch-user-button:active:focus, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active:focus { - background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.16), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(250, 250, 251, 0.16), 5%); } + .unlock-dialog .button:checked, + .unlock-dialog .icon-button:checked, + .unlock-dialog .calendar .calendar-month-header .pager-button:checked, + .calendar .calendar-month-header .unlock-dialog .pager-button:checked, + .unlock-dialog .message .message-header .message-expand-button:checked, + .message .message-header .unlock-dialog .message-expand-button:checked, + .unlock-dialog .message .message-header .message-close-button:checked, + .message .message-header .unlock-dialog .message-close-button:checked, + .unlock-dialog .screenshot-ui-show-pointer-button:checked, + .unlock-dialog .login-dialog-button.cancel-button:checked, + .unlock-dialog .login-dialog-button.switch-user-button:checked, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked { - color: whitesmoke; - background-color: st-lighten(st-mix(whitesmoke, #353535, 9%), 8%); } ++ color: #fafafb; ++ background-color: st-lighten(st-mix(#fafafb, #36363a, 9%), 8%); } + .unlock-dialog .button:checked:hover, + .unlock-dialog .icon-button:checked:hover, + .unlock-dialog .calendar .calendar-month-header .pager-button:checked:hover, + .calendar .calendar-month-header .unlock-dialog .pager-button:checked:hover, + .unlock-dialog .message .message-header .message-expand-button:checked:hover, + .message .message-header .unlock-dialog .message-expand-button:checked:hover, + .unlock-dialog .message .message-header .message-close-button:checked:hover, + .message .message-header .unlock-dialog .message-close-button:checked:hover, + .unlock-dialog .screenshot-ui-show-pointer-button:checked:hover, + .unlock-dialog .login-dialog-button.cancel-button:checked:hover, + .unlock-dialog .login-dialog-button.switch-user-button:checked:hover, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked:hover { - background-color: st-lighten(st-lighten(st-mix(whitesmoke, #353535, 9%), 8%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #36363a, 9%), 8%), 4%); } + .unlock-dialog .button:checked:active, + .unlock-dialog .icon-button:checked:active, + .unlock-dialog .calendar .calendar-month-header .pager-button:checked:active, + .calendar .calendar-month-header .unlock-dialog .pager-button:checked:active, + .unlock-dialog .message .message-header .message-expand-button:checked:active, + .message .message-header .unlock-dialog .message-expand-button:checked:active, + .unlock-dialog .message .message-header .message-close-button:checked:active, + .message .message-header .unlock-dialog .message-close-button:checked:active, + .unlock-dialog .screenshot-ui-show-pointer-button:checked:active, + .unlock-dialog .login-dialog-button.cancel-button:checked:active, + .unlock-dialog .login-dialog-button.switch-user-button:checked:active, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked:active { - background-color: st-lighten(st-lighten(st-mix(whitesmoke, #353535, 9%), 8%), 9%); } ++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #36363a, 9%), 8%), 9%); } + .unlock-dialog .button:insensitive, + .unlock-dialog .icon-button:insensitive, + .unlock-dialog .calendar .calendar-month-header .pager-button:insensitive, + .calendar .calendar-month-header .unlock-dialog .pager-button:insensitive, + .unlock-dialog .message .message-header .message-expand-button:insensitive, + .message .message-header .unlock-dialog .message-expand-button:insensitive, + .unlock-dialog .message .message-header .message-close-button:insensitive, + .message .message-header .unlock-dialog .message-close-button:insensitive, + .unlock-dialog .screenshot-ui-show-pointer-button:insensitive, + .unlock-dialog .login-dialog-button.cancel-button:insensitive, + .unlock-dialog .login-dialog-button.switch-user-button:insensitive, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:insensitive { - color: st-transparentize(whitesmoke, 0.5); - background-color: st-darken(st-mix(whitesmoke, #353535, 9%), 3%); } ++ color: st-transparentize(#fafafb, 0.5); ++ background-color: st-darken(st-mix(#fafafb, #36363a, 9%), 3%); } + +.unlock-dialog .login-dialog-prompt-entry { - background-color: rgba(245, 245, 245, 0.1); - color: rgba(245, 245, 245, 0.7); } ++ background-color: rgba(250, 250, 251, 0.1); ++ color: rgba(250, 250, 251, 0.7); } + .unlock-dialog .login-dialog-prompt-entry:hover { + background-color: rgba(255, 255, 255, 0.1); - color: whitesmoke; } ++ color: #fafafb; } + .unlock-dialog .login-dialog-prompt-entry:focus { - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.1), 5%); - color: whitesmoke; - box-shadow: inset 0 0 0 2px rgba(245, 245, 245, 0.4) !important; - background-color: st-mix(rgba(245, 245, 245, 0.4), rgba(245, 245, 245, 0.1), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(rgba(250, 250, 251, 0.4), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(250, 250, 251, 0.1), 5%); ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(rgba(250, 250, 251, 0.4), 0.2) !important; ++ background-color: st-mix(rgba(250, 250, 251, 0.4), rgba(250, 250, 251, 0.1), 5%); } + .unlock-dialog .login-dialog-prompt-entry:insensitive { - background-color: rgba(237, 237, 237, 0.1); - color: rgba(245, 245, 245, 0.5); } ++ background-color: rgba(242, 242, 244, 0.1); ++ color: rgba(250, 250, 251, 0.5); } + .unlock-dialog .login-dialog-prompt-entry StLabel.hint-text { - color: rgba(245, 245, 245, 0.7); } ++ color: rgba(250, 250, 251, 0.7); } + +/* WIDGETS */ +.shell-link { + color: st-lighten(-st-accent-color, 20%); } + .shell-link:hover { + color: st-lighten(st-lighten(-st-accent-color, 20%), 10%); } + +.lowres-icon { + icon-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } + +.icon-dropshadow { + icon-shadow: 0 2px 4px rgba(0, 0, 0, 0.4); } + +/* Entries */ +StEntry StIcon.capslock-warning { + icon-size: 1.091em; - warning-color: #f6d32d; ++ warning-color: #cd9309; + padding: 0 4px; } + +StEntry StIcon.peek-password { + icon-size: 1.091em; + padding: 0 4px; } + +StEntry StLabel.hint-text { + margin-left: 2px; } + +/* Buttons */ +.button { + min-height: 1.5em; } + +.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .screenshot-ui-show-pointer-button, .message .message-header .message-expand-button, +.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button { + border-radius: 999px; + padding: 0.818em; + min-height: 1.091em; } + .icon-button StIcon, .login-dialog-button.cancel-button StIcon, .login-dialog-button.switch-user-button StIcon, .login-dialog-button.login-dialog-session-list-button StIcon, .screenshot-ui-show-pointer-button StIcon, .message .message-header .message-expand-button StIcon, + .message .message-header .message-close-button StIcon, .calendar .calendar-month-header .pager-button StIcon { + icon-size: 1.091em; + -st-icon-style: symbolic; } + +/* Check Boxes */ +.check-box StBoxLayout { + spacing: .8em; } + +.check-box StBin { + border-radius: 7px; + padding: 2px; } + +.check-box:focus StBin { + background-color: rgba(0, 0, 0, 0.01); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.65); } + +.check-box StIcon { + icon-size: 14px; + padding: 1px; + color: transparent; + border-radius: 6px; + border: 2px solid rgba(255, 255, 255, 0.15); } + +.check-box:hover StIcon { + border-color: rgba(255, 255, 255, 0.2); } + +.check-box:active StIcon { + border-color: rgba(255, 255, 255, 0.3); } + +.check-box:checked StIcon { + background-color: -st-accent-color; + color: -st-accent-fg-color; + border-color: transparent; } + +.check-box:checked:hover StIcon { + background-color: st-lighten(-st-accent-color, 5%); + color: st-lighten(-st-accent-fg-color, 5%); } + +.check-box:checked:active StIcon { + background-color: st-darken(-st-accent-color, 7%); + color: st-darken(-st-accent-fg-color, 7%); } + +/* Switches */ +.toggle-switch { + width: 46px; + border-radius: 999px; + transition-duration: 100ms; + color: #ffffff; + background: rgba(255, 255, 255, 0.15); } + .toggle-switch:hover { + background: rgba(255, 255, 255, 0.2); } + .toggle-switch StIcon { + icon-size: 16px; } + .toggle-switch .handle { + margin: 3px; + width: 20px; + height: 20px; + border-radius: 999px; - background: #d7d7d7; ++ background: #d7d7d8; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + transition-duration: 100ms; } + .toggle-switch:checked { + background: -st-accent-color; + color: -st-accent-fg-color; } + .toggle-switch:checked:hover { + background-color: st-lighten(-st-accent-color, 5%); + color: st-lighten(-st-accent-fg-color, 5%); } + .toggle-switch:checked .handle { + background: white; } + +/* Slider */ +.slider { + color: #e8e8e8; + -barlevel-height: 4px; + -barlevel-background-color: rgba(255, 255, 255, 0.1); + -barlevel-active-background-color: -st-accent-color; + -barlevel-overdrive-color: #c01c28; + -barlevel-overdrive-separator-width: 1px; + -slider-handle-radius: 0.5455em; } + .slider:hover { + color: #ffffff; } + +/* Scrollbars */ +StScrollView.vfade { + -st-vfade-offset: 68px; } + +StScrollView.hfade { + -st-hfade-offset: 68px; } + +StScrollBar { + padding: 0; } + StScrollView StScrollBar { + min-width: 8px; + min-height: 8px; } + StScrollBar StBin#trough { + border-radius: 0; + background-color: transparent; } + StScrollBar StButton#vhandle, StScrollBar StButton#hhandle { + border-radius: 8px; - background-color: #717171; ++ background-color: #727275; + border: 3px solid transparent; + transition: 500ms all ease; } + StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover { - background-color: #9a9a9a; } ++ background-color: #9b9b9d; } + StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active { - background-color: #868686; } ++ background-color: #868689; } + +/* Popovers/Menus */ +.popup-menu-boxpointer, .candidate-popup-boxpointer { + -arrow-rise: 6px; } + +.popup-menu { + min-width: 15em; + color: #ffffff; } + .popup-menu.panel-menu { + margin-bottom: 1.75em; } + +.popup-menu-content, .candidate-popup-content { + padding: 6px; - background-color: #353535; ++ background-color: #36363a; + border-radius: 20px; - border: 1px solid #424242; ++ border: 1px solid #424247; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2); } + +.popup-menu-item { + background-color: transparent; + border-color: transparent; + box-shadow: none; + border-radius: 12px; } + .popup-menu-item:insensitive { + background-color: transparent !important; } - .popup-menu-item:hover { - color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #424242, 9%), 4%); } + .popup-menu-item:active { + color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #424242, 9%), 9%); } ++ background-color: st-lighten(#424247, 9%); } + .popup-menu-item:active:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #424242, 9%), 9%), 4%); } ++ background-color: st-lighten(st-lighten(#424247, 9%), 7%); } + .popup-menu-item:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #424242, 9%), 9%), 5%); } - .popup-menu-item:selected, .popup-menu-item:checked { ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#424247, 9%), 5%); } ++ .popup-menu-item:hover, .popup-menu-item:selected, .popup-menu-item:checked { + color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #424242, 9%), 8%); } - .popup-menu-item:selected:hover, .popup-menu-item:checked:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #424242, 9%), 8%), 4%); } - .popup-menu-item:selected:active, .popup-menu-item:checked:active { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #424242, 9%), 8%), 9%); } ++ background-color: st-lighten(#424247, 7%); } + .popup-menu-item:insensitive { + color: st-transparentize(#ffffff, 0.5); - background-color: st-darken(st-mix(#ffffff, #424242, 9%), 3%); } ++ background-color: #424247; } + .popup-menu-item:checked { + border-radius: 12px 12px 0 0 !important; } + .popup-menu-item .toggle-switch:ltr { + margin-left: 4px; } + .popup-menu-item .toggle-switch:rtl { + margin-right: 4px; } + +.popup-ornamented-menu-item:ltr { + padding-left: 6px; } + +.popup-ornamented-menu-item:rtl { + padding-right: 6px; } + +.popup-inactive-menu-item { + color: #ffffff; } + .popup-inactive-menu-item:insensitive { - color: #9a9a9a; } ++ color: #9b9b9d; } + +.popup-menu-arrow, +.popup-menu-icon { + icon-size: 1.091em; } + +.popup-sub-menu { + border-radius: 0 0 13px 13px; + margin-bottom: 6px; + border: 1px solid transparent; - background-color: #565656; } ++ background-color: #56565c; } + .popup-sub-menu .popup-menu-item { + border-radius: 0; + border-top-width: 0; + background-color: transparent; + border-color: transparent; + box-shadow: none; } + .popup-sub-menu .popup-menu-item:insensitive { + background-color: transparent !important; } - .popup-sub-menu .popup-menu-item:hover { - color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #565656, 9%), 4%); } + .popup-sub-menu .popup-menu-item:active { + color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #565656, 9%), 9%); } ++ background-color: st-lighten(#56565c, 9%); } + .popup-sub-menu .popup-menu-item:active:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #565656, 9%), 9%), 4%); } ++ background-color: st-lighten(st-lighten(#56565c, 9%), 7%); } + .popup-sub-menu .popup-menu-item:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #565656, 9%), 9%), 5%); } - .popup-sub-menu .popup-menu-item:selected, .popup-sub-menu .popup-menu-item:checked { ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#56565c, 9%), 5%); } ++ .popup-sub-menu .popup-menu-item:hover, .popup-sub-menu .popup-menu-item:selected, .popup-sub-menu .popup-menu-item:checked { + color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #565656, 9%), 8%); } - .popup-sub-menu .popup-menu-item:selected:hover, .popup-sub-menu .popup-menu-item:checked:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #565656, 9%), 8%), 4%); } - .popup-sub-menu .popup-menu-item:selected:active, .popup-sub-menu .popup-menu-item:checked:active { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #565656, 9%), 8%), 9%); } ++ background-color: st-lighten(#56565c, 7%); } + .popup-sub-menu .popup-menu-item:insensitive { + color: st-transparentize(#ffffff, 0.5); - background-color: st-darken(st-mix(#ffffff, #565656, 9%), 3%); } ++ background-color: #56565c; } + .popup-sub-menu .popup-menu-item:last-child { + border-radius: 0 0 12px 12px; + border-bottom-width: 0; } + .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:hover, .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:focus { + border-radius: 0; } + .popup-sub-menu .popup-menu-section:last-child .popup-menu-item:last-child { + border-radius: 0 0 12px 12px; } + +.popup-menu-ornament { + icon-size: 1.091em !important; + width: 1.091em; } + +.popup-separator-menu-item { + border: none !important; } + .popup-separator-menu-item .popup-separator-menu-item-separator { + height: 1px; + background-color: rgba(255, 255, 255, 0.1); } + .popup-sub-menu .popup-separator-menu-item { + background-color: transparent; } + .popup-sub-menu .popup-separator-menu-item:ltr { + margin-right: 2.5em; } + .popup-sub-menu .popup-separator-menu-item:rtl { + margin-left: 2.5em; } + .popup-sub-menu .popup-separator-menu-item .popup-separator-menu-item-separator { + background-color: rgba(255, 255, 255, 0.1); } + +.background-menu { + -boxpointer-gap: 0px; + -arrow-rise: 0px; } + +.app-menu { + max-width: 27.25em; } + .app-menu .popup-inactive-menu-item:first-child > StLabel:ltr { + margin-right: 8px; } + .app-menu .popup-inactive-menu-item:first-child > StLabel:rtl { + margin-left: 8px; } + +/* Date/Time Menu */ +#calendarArea { + padding: 4px; } + +.datemenu-popover { + border-radius: 30px; } + +.datemenu-calendar-column { + spacing: 6px; } + .datemenu-calendar-column:ltr { + margin-left: 6px; } + .datemenu-calendar-column:rtl { + margin-right: 6px; } + .datemenu-calendar-column .datemenu-displays-box { + spacing: 6px; } + +.datemenu-today-button { + padding: 9px; } + .datemenu-today-button .day-label { + font-weight: bold; } + +.calendar { + margin-top: 0; + padding: 0; } + .calendar .calendar-month-header .calendar-change-month-back StIcon, + .calendar .calendar-month-header .calendar-change-month-forward StIcon { + icon-size: 1.091em; } + .calendar .calendar-month-header .calendar-month-label { + color: #ffffff !important; + padding: 8px 0; + width: 10em; + border-radius: 999px; + text-align: center; } + .calendar .calendar-month-header .pager-button { + height: 2.6em; + width: 2.6em; + padding: 0; } + .calendar .calendar-day { + border-radius: 999px; + height: 3em; + width: 3em; + margin: 2px; + padding: 0; + font-weight: bold; + text-align: center; } + .calendar .calendar-day.calendar-weekend { - color: #9a9a9a; } ++ color: #9b9b9d; } + .calendar .calendar-day.calendar-other-month { + color: rgba(255, 255, 255, 0.5); + font-weight: normal; } + .calendar .calendar-day.calendar-other-month.calendar-weekend { + color: rgba(255, 255, 255, 0.5); } + .calendar .calendar-day.calendar-today { + color: -st-accent-fg-color !important; } + .calendar .calendar-day.calendar-today.calendar-day-with-events { + background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg") !important; } + .calendar .calendar-day.calendar-day-with-events { + background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg"); + background-size: contain; } + .calendar .calendar-day-heading { + font-weight: bold; + text-align: center; + margin: 4px; + padding: 3px 6px; + border-radius: 8px; } + .calendar .calendar-week-number { + font-weight: bold; + font-feature-settings: "tnum"; + text-align: center; + margin: 6px; + padding: 0 6px; + border-radius: 4px; - background-color: rgba(154, 154, 154, 0.2); - color: #9a9a9a; } ++ background-color: rgba(155, 155, 157, 0.2); ++ color: #9b9b9d; } + +.events-button .events-box .events-title { - color: #9a9a9a; ++ color: #9b9b9d; + padding-bottom: 6px; } + +.events-button .events-box .events-list { + spacing: 6px; } + .events-button .events-box .events-list .event-box { + spacing: 6px; + border-radius: 8px; } + .events-button .events-box .events-list .event-box .event-time { - color: #9a9a9a; } ++ color: #9b9b9d; } + .events-button .events-box .events-list .event-placeholder { - color: #9a9a9a; ++ color: #9b9b9d; + font-style: italic; } + +.world-clocks-button .world-clocks-header { - color: #9a9a9a; } ++ color: #9b9b9d; } + .world-clocks-button .world-clocks-header.no-world-clocks { + color: #ffffff; } + +.world-clocks-button .world-clocks-grid { + spacing-rows: 6px; + spacing-columns: 12px; } + .world-clocks-button .world-clocks-grid .world-clocks-time { + font-weight: bold; } + .world-clocks-button .world-clocks-grid .world-clocks-time:ltr { + text-align: right; } + .world-clocks-button .world-clocks-grid .world-clocks-time:rtl { + text-align: left; } + .world-clocks-button .world-clocks-grid .world-clocks-timezone { - color: #9a9a9a; } ++ color: #9b9b9d; } + +.weather-button .weather-box { + spacing: 6px; } + .weather-button .weather-box .weather-header-box { + spacing: 6px; } + .weather-button .weather-box .weather-header-box .weather-header { - color: #9a9a9a; } ++ color: #9b9b9d; } + .weather-button .weather-box .weather-header-box .weather-header.no-location { + color: #ffffff; } + .weather-button .weather-box .weather-header-box .weather-header.location { + font-weight: normal; } + .weather-button .weather-box .weather-grid { + spacing-rows: 6px; + spacing-columns: 12px; } + .weather-button .weather-box .weather-grid .weather-forecast-time { + padding-top: 6px; + padding-bottom: 6px; } + .weather-button .weather-box .weather-grid .weather-forecast-icon { + icon-size: 2.182em; + margin-bottom: 4px; } + .weather-button .weather-box .weather-grid .weather-forecast-temp { + font-weight: bold; } + +/* Message List */ +.message-list { + width: 29em; + border: solid rgba(255, 255, 255, 0.1); } + .message-list:ltr { + margin-left: 0; + margin-right: 4px; + padding-right: 6px; + border-right-width: 1px; } + .message-list:rtl { + margin-right: 0; + margin-left: 4px; + padding-left: 6px; + border-left-width: 1px; } + .message-list .message-list-placeholder { - color: rgba(255, 255, 255, 0.25); } ++ color: rgba(255, 255, 255, 0.45); } + .message-list .message-list-placeholder > StIcon { + icon-size: 96px; + margin-bottom: 12px; + -st-icon-style: symbolic; } + +.message-list-sections { + spacing: 12px; } + .message-list-sections:ltr { + margin-right: 12px; } + .message-list-sections:rtl { + margin-left: 12px; } + +.message-list-section, +.message-list-section-list { + spacing: 12px; } + +.message-list-controls { + padding: 12px; + padding-bottom: 6px; + spacing: 6px; } + .message-list-controls .dnd-button { + border-width: 2px; + border-color: transparent; + border-radius: 32px; + border-style: solid; } + .message-list-controls .dnd-button:focus { + border-color: st-transparentize(-st-accent-color, 0.4); } + +.message { + padding: 6px; + margin: 0; + border-radius: 16px; } + .message .message-header { + spacing: 6px; - color: #9a9a9a; ++ color: #9b9b9d; + padding: 0 6px; } + .message .message-header:ltr { + padding-right: 0; } + .message .message-header:rtl { + padding-left: 0; } + .message .message-header .message-source-icon { + icon-size: 1.091em; + -st-icon-style: symbolic; } + .message .message-header .message-header-content { + spacing: 6px; + min-height: 1.637em; + padding-bottom: 6px; } + .message .message-header .message-header-content .message-source-title { + font-weight: bold; } + .message .message-header .message-header-content .event-time { - color: #9a9a9a; ++ color: #9b9b9d; + padding-bottom: 0.068em; } + .message .message-header .message-header-content .event-time:ltr { + text-align: right; } + .message .message-header .message-header-content .event-time:rtl { + text-align: left; } + .message .message-header .message-expand-button, + .message .message-header .message-close-button { + border-radius: 999px; + color: #ffffff; } + .message .message-header .message-expand-button { + padding: 6px; } + .message .message-header .message-close-button { + margin: 3px; + padding: 4px; } + .message .message-box { + padding: 6px; + margin-top: 0; + spacing: 6px; } + .message .message-box .message-icon { + icon-size: 48px; } + .message .message-box .message-icon:ltr { + margin-right: 6px; } + .message .message-box .message-icon:rtl { + margin-left: 6px; } + .message .message-box .message-icon.message-themed-icon { + border-radius: 999px; + background-color: rgba(255, 255, 255, 0.07); + icon-size: 1.091em; + min-width: 48px; + min-height: 48px; } + .message .message-box:first-child { + margin-top: 12px; } + .message .message-box .message-content { + spacing: 4px; } + .message .message-box .message-content .message-title { + font-weight: bold; } + .message .message-action-bin { + padding: 4px; + spacing: 6px; } + .message .message-action-bin * { + margin: 0 4px; } + .message .message-action-bin *:first-child:ltr { + margin-left: 0; } + .message .message-action-bin *:first-child:rtl { + margin-right: 0; } + .message .message-action-bin *:last-child:ltr { + margin-right: 0; } + .message .message-action-bin *:last-child:rtl { + margin-left: 0; } + +.url-highlighter { + link-color: st-lighten(-st-accent-color, 20%); } + +/* Media Controls */ +.message-media-control { + padding: 0 18px; + border-radius: 8px; + color: #ffffff; + border: 1px solid transparent; } + .message-media-control:hover { - background-color: #5b5b5b; ++ background-color: #5b5b62; + color: #ffffff; } + .message-media-control:active { - background-color: #606060; ++ background-color: #606067; + color: #ffffff; } + .message-media-control:insensitive { - color: #a7a7a7; } ++ color: #a8a8aa; } + .message-media-control StIcon { + icon-size: 16px; } + +.media-message .message-icon { + border-radius: 8px !important; } + .media-message .message-icon.message-themed-icon { + icon-size: 32px !important; } + +.candidate-popup-content { + padding: 6px; + spacing: 6px; + border-radius: 12px; } + +.candidate-index { + padding: 0; + padding-right: 6px; - color: #9a9a9a; } ++ color: #9b9b9d; } + +.candidate-box { + padding: 6px 12px 6px 12px; + border-radius: 8px; } + .candidate-box:selected { + background-color: -st-accent-color; + color: -st-accent-fg-color; } + .candidate-box:hover { - background-color: #4e4e4e; ++ background-color: #4f4f54; + color: white; } + +.candidate-page-button-box { + height: 2em; } + .vertical .candidate-page-button-box { + padding-top: 12px; } + .horizontal .candidate-page-button-box { + padding-left: 12px; } + +.candidate-page-button { + padding: 6px; } + .candidate-page-button StIcon { + icon-size: 16px; } + +.candidate-page-button-previous { + border-radius: 8px 0px 0px 8px; + border-right-width: 0; + box-shadow: none; } + +.candidate-page-button-next { + border-radius: 0px 8px 8px 0px; + box-shadow: none; } + +/* Notifications & Message Tray */ +.notification-banner { + min-height: 64px; + width: 34em; + box-shadow: 0 2px 4px 2px rgba(0, 0, 0, 0.2); + border-radius: 16px; + margin: 4px; } + +.notification-buttons-bin { + spacing: 0; } + +/* Modal Dialogs */ +.modal-dialog { - background-color: #353535; ++ background-color: #36363a; + border-radius: 18px; + padding: 24px; + spacing: 18px; + box-shadow: 0 12px 8px 12px rgba(0, 0, 0, 0.03); } + .modal-dialog .modal-dialog-content-box { + padding-top: 12px; + spacing: 18px; + max-width: 28em; } + .modal-dialog .modal-dialog-button-box { + padding-top: 6px; } + +.dialog-list { + spacing: 18px; } + .dialog-list .dialog-list-title { + text-align: center; } + .dialog-list .dialog-list-scrollview { + max-height: 200px; } + .dialog-list .dialog-list-box { + spacing: 1em; } + .dialog-list .dialog-list-box .dialog-list-item { + spacing: 1em; } + .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-title { + font-weight: bold; } + .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description { + color: #f2f2f2; } + +/* End Session Dialog */ +.end-session-dialog { + width: 24em; } + .end-session-dialog .end-session-dialog-battery-warning, + .end-session-dialog .dialog-list-title { - color: #f6d32d; - background-color: rgba(246, 211, 45, 0.1); ++ color: #cd9309; ++ background-color: rgba(205, 147, 9, 0.1); + padding: 9px; + border-radius: 8px; + margin: 4px 0; } + +/* Message Dialog */ +.message-dialog-content { + spacing: 18px; } + .message-dialog-content .message-dialog-title { + text-align: center; } + .message-dialog-content .message-dialog-description { + text-align: center; } + +/* Run Dialog */ +.run-dialog { + width: 24em; + padding-bottom: 6px; } + .run-dialog .run-dialog-entry { + padding: 12px 9px; } + .run-dialog .run-dialog-description { + color: #cccccc; } + +/* Password or Authentication Dialog */ +.prompt-dialog { + width: 28em; } + .prompt-dialog .prompt-dialog-password-grid { + spacing-rows: 8px; + spacing-columns: 4px; } + .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry { + width: auto; } + .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry:ltr { + margin-left: 20px; } + .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry:rtl { + margin-right: 20px; } + .prompt-dialog .prompt-dialog-password-layout { + spacing: 8px; } + .prompt-dialog .prompt-dialog-password-entry { + width: 20em; + padding: 12px 9px; } + .prompt-dialog .prompt-dialog-error-label, + .prompt-dialog .prompt-dialog-info-label, + .prompt-dialog .prompt-dialog-null-label { + text-align: center; } + .prompt-dialog .prompt-dialog-error-label { - color: #f6d32d; } ++ color: #cd9309; } + +/* Polkit Dialog */ +.polkit-dialog-user-layout { + text-align: center; + spacing: 8px; + margin-bottom: 6px; } + .polkit-dialog-user-layout .polkit-dialog-user-root-label { - color: #f6d32d; } ++ color: #cd9309; } + +/* Audio selection dialog */ +.audio-device-selection-dialog { + min-width: 24em; } + .audio-device-selection-dialog .audio-selection-box { + spacing: 12px; } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device { + color: #ffffff; - background-color: #353535; } ++ background-color: #2e2e33; ++ background-color: transparent; } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:focus { + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(46, 46, 51, 0.25), 5%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#2e2e33, 7%), 5%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:hover { + color: #ffffff; - background-color: st-lighten(#353535, 7%); } ++ background-color: st-lighten(#2e2e33, 7%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active { + color: #ffffff; - background-color: st-lighten(#353535, 9%); } ++ background-color: st-lighten(#2e2e33, 9%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active:hover { - background-color: st-lighten(st-lighten(#353535, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#2e2e33, 9%), 7%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#2e2e33, 9%), 5%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked { + color: #ffffff; - background-color: st-lighten(#353535, 8%); } ++ background-color: st-lighten(#2e2e33, 8%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted:hover, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected:hover, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked:hover { - background-color: st-lighten(st-lighten(#353535, 8%), 7%); } ++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 7%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted:active, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected:active, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked:active { - background-color: st-lighten(st-lighten(#353535, 8%), 9%); } ++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 9%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:insensitive { + color: st-transparentize(#ffffff, 0.5); - background-color: #353535; } ++ background-color: #2e2e33; } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:drop { + background-color: st-transparentize(-st-accent-color, 0.8); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device .audio-selection-device-box { + padding: 12px; + spacing: 12px; } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device .audio-selection-device-icon { + icon-size: 64px; } + +/* Welcome dialog */ +.welcome-dialog-image { + background-image: url("resource:///org/gnome/shell/theme/gnome-shell-start.svg"); + background-size: contain; + /* Reasonable maximum dimensions */ + height: 300px; + width: 300px; } + +/* Access portal dialog */ +.access-dialog { + text-align: center; } + +/* OSD */ +.osd-window { + text-align: center; + font-weight: bold; + spacing: 12px; + padding: 12px 18px; + margin-bottom: 4em; } + .osd-window > * { + spacing: 8px; } + .osd-window StIcon { + icon-size: 32px; } + .osd-window StLabel:ltr { + margin-right: 6px; } + .osd-window StLabel:rtl { + margin-left: 6px; } + .osd-window .level { + margin-bottom: 4px; + min-width: 160px; + -barlevel-height: 6px; + -barlevel-background-color: rgba(255, 255, 255, 0.1); + -barlevel-active-background-color: #ffffff; + -barlevel-overdrive-color: #c01c28; + -barlevel-overdrive-separator-width: 3px; } + .osd-window .level:first-child { + margin-bottom: 0; } + .osd-window .level:ltr { + margin-right: 6px; } + .osd-window .level:rtl { + margin-left: 6px; } + - .osd-monitor-label { ++.osd-monitor-label, .osd-break-countdown-label { + background-color: -st-accent-color; + color: -st-accent-fg-color; + border-radius: 16px; + font-size: 3em; + font-weight: bold; + font-feature-settings: "tnum"; + margin: 12px; + padding: 12px; + text-align: center; + min-width: 1.5em; } + +/* Pad OSD */ +.pad-osd-window { + padding: 32px; + background-color: rgba(0, 0, 0, 0.8); } + .pad-osd-window .pad-osd-title-box { + spacing: 12px; } + .pad-osd-window .pad-osd-title-menu-box { + spacing: 6px; } + +.combo-box-label { + width: 15em; } + +/* App Switcher */ +.switcher-popup { + padding: 0; + spacing: 24px; } + +.switcher-list { + padding: 12px; + border-radius: 28px; + box-shadow: 0 8px 8px 0 rgba(0, 0, 0, 0.2); } + .switcher-list .switcher-list-item-container { + spacing: 12px; } + .switcher-list .item-box { + color: #ffffff; - background-color: #353535; } ++ background-color: #2e2e33; ++ background-color: transparent; } + .switcher-list .item-box:focus { + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(46, 46, 51, 0.25), 5%); } + .switcher-list .item-box:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#2e2e33, 7%), 5%); } + .switcher-list .item-box:hover { + color: #ffffff; - background-color: st-lighten(#353535, 7%); } ++ background-color: st-lighten(#2e2e33, 7%); } + .switcher-list .item-box:active { + color: #ffffff; - background-color: st-lighten(#353535, 9%); } ++ background-color: st-lighten(#2e2e33, 9%); } + .switcher-list .item-box:active:hover { - background-color: st-lighten(st-lighten(#353535, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#2e2e33, 9%), 7%); } + .switcher-list .item-box:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#2e2e33, 9%), 5%); } + .switcher-list .item-box:highlighted, .switcher-list .item-box:selected, .switcher-list .item-box:checked { + color: #ffffff; - background-color: st-lighten(#353535, 8%); } ++ background-color: st-lighten(#2e2e33, 8%); } + .switcher-list .item-box:highlighted:hover, .switcher-list .item-box:selected:hover, .switcher-list .item-box:checked:hover { - background-color: st-lighten(st-lighten(#353535, 8%), 7%); } ++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 7%); } + .switcher-list .item-box:highlighted:active, .switcher-list .item-box:selected:active, .switcher-list .item-box:checked:active { - background-color: st-lighten(st-lighten(#353535, 8%), 9%); } ++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 9%); } + .switcher-list .item-box:insensitive { + color: st-transparentize(#ffffff, 0.5); - background-color: #353535; } ++ background-color: #2e2e33; } + .switcher-list .item-box:drop { + background-color: st-transparentize(-st-accent-color, 0.8); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); } + .switcher-list .item-box:hover { + background: none; } + .switcher-list .item-box:selected { + background-color: rgba(255, 255, 255, 0.2); } + .switcher-list .separator { + width: 1px; + background: rgba(255, 255, 255, 0.1); } + .switcher-list .thumbnail-box { + padding: 2px; + spacing: 6px; } + .switcher-list .thumbnail { + width: 256px; + border-radius: 8px; } + +.switcher-arrow { + border-color: rgba(255, 255, 255, 0.8); + color: rgba(255, 255, 255, 0.8); } + .switcher-arrow:highlighted { + border-color: #ffffff; + color: #ffffff; } + +.input-source-switcher-symbol { + font-size: 34pt; + width: 96px; + height: 96px; } + +.cycler-highlight { + border: 5px solid -st-accent-color; } + +/* Workspace Switcher */ +.workspace-switcher { + margin-bottom: 4em; + spacing: 12px; + padding: 12px 18px; } + +.ws-switcher-indicator { + background-color: rgba(255, 255, 255, 0.5); + padding: 2.6666666667px; + margin: 13.3333333333px; + border-radius: 32px; } + .ws-switcher-indicator:active { + background-color: #ffffff; + padding: 5.3333333333px; + margin: 10.6666666667px; } + +.screenshot-ui-panel { + border-radius: 32px; + padding: 18px; + padding-bottom: 12px; + margin-bottom: 4em; + spacing: 12px; } + +.screenshot-ui-close-button { + padding: 6px !important; + margin-top: 12px; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2); } + .screenshot-ui-close-button.left { + margin-left: 12px; } + .screenshot-ui-close-button.right { + margin-right: 12px; } + +.screenshot-ui-type-button { + min-width: 48px; + padding: 12px 18px; + border-radius: 14px; } + .screenshot-ui-type-button .icon-label-button-container { + spacing: 0.409em; } + .screenshot-ui-type-button .icon-label-button-container > StIcon { + icon-size: 32px; } + +.screenshot-ui-capture-button { + width: 32px; + height: 32px; + border-radius: 999px; + border: 4px #ffffff; + padding: 4px; } + .screenshot-ui-capture-button .screenshot-ui-capture-button-circle { + background-color: #ffffff; + transition-duration: 200ms; + border-radius: 999px; } + .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:hover, .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:focus { - background-color: #4e4e4e; } ++ background-color: #4f4f54; } + .screenshot-ui-capture-button:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:focus .screenshot-ui-capture-button-circle { + background-color: #cccccc; } + .screenshot-ui-capture-button:active .screenshot-ui-capture-button-circle { + background-color: gray; } + .screenshot-ui-capture-button:cast .screenshot-ui-capture-button-circle { + background-color: #c01c28; } + .screenshot-ui-capture-button:cast:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:cast:focus .screenshot-ui-capture-button-circle { + background-color: #d61f2d; } + .screenshot-ui-capture-button:cast:active .screenshot-ui-capture-button-circle { + background-color: #a11722; } + +.screenshot-ui-shot-cast-container { + background-color: rgba(255, 255, 255, 0.1); + border-radius: 999px; + padding: 3px; + spacing: 3px; } + +.screenshot-ui-shot-cast-button { + padding: 6px 12px; + background-color: transparent; + border-radius: 999px; } + .screenshot-ui-shot-cast-button > StIcon { + icon-size: 16px; } + .screenshot-ui-shot-cast-button:hover, .screenshot-ui-shot-cast-button:focus { + background-color: rgba(255, 255, 255, 0.2); } + .screenshot-ui-shot-cast-button:active { + background-color: rgba(255, 255, 255, 0.5); } + .screenshot-ui-shot-cast-button:checked { + background-color: #ffffff; - color: #353535; } ++ color: #2e2e33; } + .screenshot-ui-shot-cast-button:insensitive { + color: rgba(255, 255, 255, 0.5); } + +.screenshot-ui-area-indicator-shade { + background-color: rgba(0, 0, 0, 0.3); } + +.screenshot-ui-area-selector .screenshot-ui-area-indicator-shade { + background-color: rgba(0, 0, 0, 0.5); } + +.screenshot-ui-area-selector .screenshot-ui-area-indicator-selection { + border: 2px white; } + +.screenshot-ui-area-selector-handle { + border-radius: 999px; + background-color: white; + box-shadow: 0 1px 3px 2px rgba(0, 0, 0, 0.2); + width: 24px; + height: 24px; } + +.screenshot-ui-window-selector { - background-color: #282828; } ++ background-color: #222226; } + .screenshot-ui-window-selector .screenshot-ui-window-selector-window-container { + margin: 100px; } + .screenshot-ui-window-selector:primary-monitor .screenshot-ui-window-selector-window-container { + margin-bottom: 200px; } + +.screenshot-ui-window-selector-window-border { + transition-duration: 200ms; + border-radius: 16px; + border: 6px transparent; } + +.screenshot-ui-window-selector-check { + transition-duration: 200ms; + color: transparent; + border-radius: 999px; + border-width: 12px; + icon-size: 24px; } + +.screenshot-ui-window-selector-window:hover .screenshot-ui-window-selector-window-border { + border-color: st-darken(-st-accent-color, 15%); } + +.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-window-border { + border-color: -st-accent-color; + background-color: st-transparentize(-st-accent-color, 0.8); } + +.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-check { + color: -st-accent-fg-color; + background-color: -st-accent-color; } + +.screenshot-ui-screen-selector { + transition-duration: 200ms; + background-color: rgba(0, 0, 0, 0.5); } + .screenshot-ui-screen-selector:hover { + background-color: rgba(0, 0, 0, 0.3); } + .screenshot-ui-screen-selector:active { + background-color: rgba(0, 0, 0, 0.7); } + .screenshot-ui-screen-selector:checked { + background-color: transparent; + border: 2px white; } + +.screenshot-ui-tooltip { + text-align: center; + -y-offset: 24px; } + +/* Top Bar */ +#panel { + background-color: #000000; + font-weight: bold; + height: 2.2em; + transition-duration: 250ms; } + #panel .panel-button { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; + color: #ffffff; + box-shadow: inset 0 0 0 100px transparent; + -natural-hpadding: 12px; + -minimum-hpadding: 6px; } + #panel .panel-button:focus, #panel .panel-button:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); } + #panel .panel-button:active, #panel .panel-button:checked { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); } + #panel .panel-button:active:hover, #panel .panel-button:checked:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); } + #panel .panel-button .system-status-icon { + icon-size: 1.091em; + padding: 0 6px; + margin: 0 4px; } + #panel .panel-button .app-menu-icon { + -st-icon-style: symbolic; } + #panel .panel-button .panel-status-menu-box, + #panel .panel-button .panel-status-indicators-box { + spacing: 4px; } + #panel .panel-button .panel-status-menu-box > .system-status-icon, + #panel .panel-button .panel-status-indicators-box > .system-status-icon { + padding: 0; } + #panel .panel-button#panelActivities StBoxLayout { + padding: 0 0.2045em; + spacing: 5px; } + #panel .panel-button#panelActivities .workspace-dot { + border-radius: 999px; + min-width: 0.5455em; + min-height: 0.5455em; + background-color: #ffffff; } + #panel .panel-button.screen-recording-indicator StBoxLayout, #panel .panel-button.screen-sharing-indicator StBoxLayout { + spacing: 0.409em; } + #panel .panel-button.screen-recording-indicator StIcon, #panel .panel-button.screen-sharing-indicator StIcon { + icon-size: 1.091em; } + #panel .panel-button.screen-recording-indicator { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; - color: whitesmoke; ++ color: #fafafb; + box-shadow: inset 0 0 0 100px #c01c28; } + #panel .panel-button.screen-recording-indicator:focus, #panel .panel-button.screen-recording-indicator:hover { + box-shadow: inset 0 0 0 100px #d61f2d; } + #panel .panel-button.screen-recording-indicator:active, #panel .panel-button.screen-recording-indicator:checked { + box-shadow: inset 0 0 0 100px #e02a37; } + #panel .panel-button.screen-recording-indicator:active:hover, #panel .panel-button.screen-recording-indicator:checked:hover { + box-shadow: inset 0 0 0 100px #e13340; } + #panel .panel-button.screen-sharing-indicator { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; - color: whitesmoke; ++ color: #fafafb; + box-shadow: inset 0 0 0 100px #ff7800; } + #panel .panel-button.screen-sharing-indicator:focus, #panel .panel-button.screen-sharing-indicator:hover { + box-shadow: inset 0 0 0 100px #ff861a; } + #panel .panel-button.screen-sharing-indicator:active, #panel .panel-button.screen-sharing-indicator:checked { + box-shadow: inset 0 0 0 100px #ff902e; } + #panel .panel-button.screen-sharing-indicator:active:hover, #panel .panel-button.screen-sharing-indicator:checked:hover { + box-shadow: inset 0 0 0 100px #ff9638; } + #panel .panel-button.clock-display { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; + color: #ffffff; + box-shadow: inset 0 0 0 100px transparent; + background: none !important; + box-shadow: none !important; + border: none !important; } + #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); } + #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:checked { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); } + #panel .panel-button.clock-display:active:hover, #panel .panel-button.clock-display:checked:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); } + #panel .panel-button.clock-display .clock { + transition-duration: 150ms; + border: 3px solid transparent; + border-radius: 999px; } + #panel .panel-button.clock-display:focus .clock, #panel .panel-button.clock-display:hover .clock { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); } + #panel .panel-button.clock-display:active .clock, #panel .panel-button.clock-display:checked .clock { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); } + #panel .panel-button.clock-display:active .clock:hover, #panel .panel-button.clock-display:checked .clock:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); } + #panel .panel-button.clock-display .messages-indicator { + icon-size: 1.091em; } + #panel:overview, #panel.unlock-screen, #panel.login-screen { + background-color: transparent; } + #panel:overview .panel-button.screen-recording-indicator, #panel.unlock-screen .panel-button.screen-recording-indicator, #panel.login-screen .panel-button.screen-recording-indicator { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; - color: whitesmoke; ++ color: #fafafb; + box-shadow: inset 0 0 0 100px #c01c28; } + #panel:overview .panel-button.screen-recording-indicator:focus, #panel:overview .panel-button.screen-recording-indicator:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:focus, #panel.unlock-screen .panel-button.screen-recording-indicator:hover, #panel.login-screen .panel-button.screen-recording-indicator:focus, #panel.login-screen .panel-button.screen-recording-indicator:hover { + box-shadow: inset 0 0 0 100px #d61f2d; } + #panel:overview .panel-button.screen-recording-indicator:active, #panel:overview .panel-button.screen-recording-indicator:checked, #panel.unlock-screen .panel-button.screen-recording-indicator:active, #panel.unlock-screen .panel-button.screen-recording-indicator:checked, #panel.login-screen .panel-button.screen-recording-indicator:active, #panel.login-screen .panel-button.screen-recording-indicator:checked { + box-shadow: inset 0 0 0 100px #e02a37; } + #panel:overview .panel-button.screen-recording-indicator:active:hover, #panel:overview .panel-button.screen-recording-indicator:checked:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:active:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:checked:hover, #panel.login-screen .panel-button.screen-recording-indicator:active:hover, #panel.login-screen .panel-button.screen-recording-indicator:checked:hover { + box-shadow: inset 0 0 0 100px #e13340; } + #panel:overview .panel-button.screen-sharing-indicator, #panel.unlock-screen .panel-button.screen-sharing-indicator, #panel.login-screen .panel-button.screen-sharing-indicator { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; - color: whitesmoke; ++ color: #fafafb; + box-shadow: inset 0 0 0 100px #ff7800; } + #panel:overview .panel-button.screen-sharing-indicator:focus, #panel:overview .panel-button.screen-sharing-indicator:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:focus, #panel.unlock-screen .panel-button.screen-sharing-indicator:hover, #panel.login-screen .panel-button.screen-sharing-indicator:focus, #panel.login-screen .panel-button.screen-sharing-indicator:hover { + box-shadow: inset 0 0 0 100px #ff861a; } + #panel:overview .panel-button.screen-sharing-indicator:active, #panel:overview .panel-button.screen-sharing-indicator:checked, #panel.unlock-screen .panel-button.screen-sharing-indicator:active, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked, #panel.login-screen .panel-button.screen-sharing-indicator:active, #panel.login-screen .panel-button.screen-sharing-indicator:checked { + box-shadow: inset 0 0 0 100px #ff902e; } + #panel:overview .panel-button.screen-sharing-indicator:active:hover, #panel:overview .panel-button.screen-sharing-indicator:checked:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:active:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked:hover, #panel.login-screen .panel-button.screen-sharing-indicator:active:hover, #panel.login-screen .panel-button.screen-sharing-indicator:checked:hover { + box-shadow: inset 0 0 0 100px #ff9638; } + #panel.unlock-screen .panel-button, #panel.login-screen .panel-button { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; + color: #ffffff; + box-shadow: inset 0 0 0 100px transparent; } + #panel.unlock-screen .panel-button:focus, #panel.unlock-screen .panel-button:hover, #panel.login-screen .panel-button:focus, #panel.login-screen .panel-button:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); } + #panel.unlock-screen .panel-button:active, #panel.unlock-screen .panel-button:checked, #panel.login-screen .panel-button:active, #panel.login-screen .panel-button:checked { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); } + #panel.unlock-screen .panel-button:active:hover, #panel.unlock-screen .panel-button:checked:hover, #panel.login-screen .panel-button:active:hover, #panel.login-screen .panel-button:checked:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); } + #panel.unlock-screen .panel-button.clock-display, #panel.login-screen .panel-button.clock-display { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; + color: #ffffff; + box-shadow: inset 0 0 0 100px transparent; + background: none !important; + box-shadow: none !important; + border: none !important; } + #panel.unlock-screen .panel-button.clock-display:focus, #panel.unlock-screen .panel-button.clock-display:hover, #panel.login-screen .panel-button.clock-display:focus, #panel.login-screen .panel-button.clock-display:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); } + #panel.unlock-screen .panel-button.clock-display:active, #panel.unlock-screen .panel-button.clock-display:checked, #panel.login-screen .panel-button.clock-display:active, #panel.login-screen .panel-button.clock-display:checked { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); } + #panel.unlock-screen .panel-button.clock-display:active:hover, #panel.unlock-screen .panel-button.clock-display:checked:hover, #panel.login-screen .panel-button.clock-display:active:hover, #panel.login-screen .panel-button.clock-display:checked:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); } + #panel.unlock-screen .panel-button.clock-display .clock, #panel.login-screen .panel-button.clock-display .clock { + transition-duration: 150ms; + border: 3px solid transparent; + border-radius: 999px; } + #panel.unlock-screen .panel-button.clock-display:focus .clock, #panel.unlock-screen .panel-button.clock-display:hover .clock, #panel.login-screen .panel-button.clock-display:focus .clock, #panel.login-screen .panel-button.clock-display:hover .clock { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); } + #panel.unlock-screen .panel-button.clock-display:active .clock, #panel.unlock-screen .panel-button.clock-display:checked .clock, #panel.login-screen .panel-button.clock-display:active .clock, #panel.login-screen .panel-button.clock-display:checked .clock { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); } + #panel.unlock-screen .panel-button.clock-display:active .clock:hover, #panel.unlock-screen .panel-button.clock-display:checked .clock:hover, #panel.login-screen .panel-button.clock-display:active .clock:hover, #panel.login-screen .panel-button.clock-display:checked .clock:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); } + #panel:overview .panel-button { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; - color: whitesmoke; ++ color: #fafafb; + box-shadow: inset 0 0 0 100px transparent; } + #panel:overview .panel-button:focus, #panel:overview .panel-button:hover { - box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.17); } ++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.17); } + #panel:overview .panel-button:active, #panel:overview .panel-button:checked { - box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.28); } ++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.28); } + #panel:overview .panel-button:active:hover, #panel:overview .panel-button:checked:hover { - box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.32); } ++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.32); } + #panel:overview .panel-button#panelActivities .workspace-dot { - background-color: whitesmoke; } ++ background-color: #fafafb; } + #panel:overview .panel-button.clock-display { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; - color: whitesmoke; ++ color: #fafafb; + box-shadow: inset 0 0 0 100px transparent; + background: none !important; + box-shadow: none !important; + border: none !important; } + #panel:overview .panel-button.clock-display:focus, #panel:overview .panel-button.clock-display:hover { - box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.17); } ++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.17); } + #panel:overview .panel-button.clock-display:active, #panel:overview .panel-button.clock-display:checked { - box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.28); } ++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.28); } + #panel:overview .panel-button.clock-display:active:hover, #panel:overview .panel-button.clock-display:checked:hover { - box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.32); } ++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.32); } + #panel:overview .panel-button.clock-display .clock { + transition-duration: 150ms; + border: 3px solid transparent; + border-radius: 999px; } + #panel:overview .panel-button.clock-display:focus .clock, #panel:overview .panel-button.clock-display:hover .clock { - box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.17); } ++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.17); } + #panel:overview .panel-button.clock-display:active .clock, #panel:overview .panel-button.clock-display:checked .clock { - box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.28); } ++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.28); } + #panel:overview .panel-button.clock-display:active .clock:hover, #panel:overview .panel-button.clock-display:checked .clock:hover { - box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.32); } ++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.32); } + #panel .panel-status-indicators-box, + #panel .panel-status-menu-box { + spacing: 2px; } + #panel .power-status.panel-status-indicators-box { + spacing: 0; } + #panel .privacy-indicator { + color: #ff7800; } + +#appMenu { + spacing: 0.409em; } + #appMenu .label-shadow { + color: transparent; } + +#appMenu .panel-status-menu-box { + padding: 0 0.409em; + spacing: 0.409em; } + +.clock-display-box { + spacing: 2px; } + .clock-display-box .clock { + padding-left: 0.818em; + padding-right: 0.818em; } + +/* Activities Ripple */ +.ripple-box { + background-color: rgba(255, 255, 255, 0.2); + box-shadow: 0 0 2px 2px rgba(255, 255, 255, 0.2); + width: 52px; + height: 52px; + border-radius: 0 0 52px 0; } + .ripple-box:rtl { + border-radius: 0 0 0 52px; } + +.quick-settings { + padding: 18px; + border-radius: 36px; } + .quick-settings .icon-button, .quick-settings .login-dialog-button.cancel-button, .quick-settings .login-dialog-button.switch-user-button, .quick-settings .login-dialog-button.login-dialog-session-list-button, .quick-settings .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-settings .pager-button, .quick-settings .message .message-header .message-expand-button, .message .message-header .quick-settings .message-expand-button, + .quick-settings .message .message-header .message-close-button, + .message .message-header .quick-settings .message-close-button, .quick-settings .screenshot-ui-show-pointer-button, .quick-settings .button { + padding: 10.5px; } + +.quick-settings-grid { + spacing-rows: 12px; + spacing-columns: 12px; } + - .quick-toggle, .quick-menu-toggle { ++.quick-toggle, .quick-toggle-has-menu { + border-radius: 999px; + min-width: 12em; + max-width: 12em; - min-height: 3.273em; - border: none; } ++ min-height: 3.273em; } + +.quick-toggle { - background-color: none; + /* Move padding into the box; this is to allow menu arrows + to extend to the border */ } + .quick-toggle > StBoxLayout { + spacing: 9px; } + .quick-toggle.button { + padding: 0; } + .quick-toggle > StBoxLayout { + padding: 0 12px; } + .quick-toggle:ltr > StBoxLayout { + padding-left: 15px; } + .quick-toggle:rtl > StBoxLayout { + padding-right: 15px; } - .quick-toggle .quick-toggle-title { - font-weight: bold; } - .quick-toggle StBoxLayout > .quick-toggle-subtitle { ++ .quick-toggle .quick-toggle-subtitle { + font-weight: normal; } + .quick-toggle .quick-toggle-icon { + icon-size: 1.091em; } + - .quick-menu-toggle .quick-toggle { ++.quick-toggle-has-menu .quick-toggle { + min-width: auto; + max-width: auto; } - .quick-menu-toggle .quick-toggle:ltr { ++ .quick-toggle-has-menu .quick-toggle:ltr { + border-radius: 999px 0 0 999px; } - .quick-menu-toggle .quick-toggle:ltr > StBoxLayout { - padding-right: 0.6135em; } - .quick-menu-toggle .quick-toggle:rtl { ++ .quick-toggle-has-menu .quick-toggle:ltr > StBoxLayout { ++ padding-right: 0.6135em; } ++ .quick-toggle-has-menu .quick-toggle:rtl { + border-radius: 0 999px 999px 0; } - .quick-menu-toggle .quick-toggle:rtr > StBoxLayout { - padding-left: 0.6135em; } - .quick-menu-toggle .quick-toggle:ltr:last-child { ++ .quick-toggle-has-menu .quick-toggle:rtl > StBoxLayout { ++ padding-left: 0.6135em; } ++ .quick-toggle-has-menu .quick-toggle:ltr:last-child { + border-radius: 999px; } - .quick-menu-toggle .quick-toggle:rtl:last-child { ++ .quick-toggle-has-menu .quick-toggle:rtl:last-child { + border-radius: 999px; } + - .quick-menu-toggle .quick-toggle-arrow { - padding: 0.409em 0.71575em; - border-width: 0; - border-color: rgba(255, 255, 255, 0.25); } - .quick-menu-toggle .quick-toggle-arrow:checked { - border-color: st-lighten(-st-accent-color, 15%); } - .quick-menu-toggle .quick-toggle-arrow:ltr { - border-radius: 0 999px 999px 0; - border-left-width: 1px; } - .quick-menu-toggle .quick-toggle-arrow:rtl { - border-radius: 999px 0 0 999px; - border-right-width: 1px; } ++.quick-toggle-has-menu .quick-toggle-menu-button { ++ padding: 0.409em 0.71575em; } ++ .quick-toggle-has-menu .quick-toggle-menu-button:ltr { ++ border-radius: 0 999px 999px 0; } ++ .quick-toggle-has-menu .quick-toggle-menu-button:rtl { ++ border-radius: 999px 0 0 999px; } ++ ++.quick-toggle-has-menu .quick-toggle-separator { ++ width: 1px; } ++ ++.quick-toggle-has-menu .quick-toggle-menu-button { ++ color: #ffffff; ++ background-color: st-mix(#ffffff, #4a4a4f, 9%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:focus { ++ color: #ffffff; ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#ffffff, #4a4a4f, 9%), 5%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:focus:hover { ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #4a4a4f, 9%), 4%), 5%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:hover { ++ color: #ffffff; ++ background-color: st-lighten(st-mix(#ffffff, #4a4a4f, 9%), 4%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:active { ++ color: #ffffff; ++ background-color: st-lighten(st-mix(#ffffff, #4a4a4f, 9%), 9%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:active:hover { ++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #4a4a4f, 9%), 9%), 4%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:active:focus { ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #4a4a4f, 9%), 9%), 5%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked { ++ color: -st-accent-fg-color; ++ background-color: st-mix(-st-accent-color, #ffffff, 85%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:focus { ++ color: -st-accent-fg-color; ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ box-shadow: inset 0 0 0 2px st-transparentize(st-lighten(-st-accent-color, 30%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(-st-accent-color, #ffffff, 85%), 5%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:focus:hover { ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(-st-accent-color, #ffffff, 85%), 4%), 5%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:hover { ++ color: -st-accent-fg-color; ++ background-color: st-lighten(st-mix(-st-accent-color, #ffffff, 85%), 4%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:active { ++ color: -st-accent-fg-color; ++ background-color: st-lighten(st-mix(-st-accent-color, #ffffff, 85%), 9%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:active:hover { ++ background-color: st-lighten(st-lighten(st-mix(-st-accent-color, #ffffff, 85%), 9%), 4%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:active:focus { ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(-st-accent-color, #ffffff, 85%), 9%), 5%); } ++ ++.quick-toggle-has-menu:checked .quick-toggle-separator { ++ background-color: st-mix(-st-accent-fg-color, -st-accent-color, 30%); } ++ ++.quick-toggle-has-menu .quick-toggle-separator { ++ background-color: rgba(255, 255, 255, 0.25); } + +.quick-slider > StBoxLayout { + spacing: 6px; } + +.quick-slider .icon-button, .quick-slider .login-dialog-button.cancel-button, .quick-slider .login-dialog-button.switch-user-button, .quick-slider .login-dialog-button.login-dialog-session-list-button, .quick-slider .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-slider .pager-button, .quick-slider .message .message-header .message-expand-button, .message .message-header .quick-slider .message-expand-button, +.quick-slider .message .message-header .message-close-button, +.message .message-header .quick-slider .message-close-button, .quick-slider .screenshot-ui-show-pointer-button { + padding: 6px; } + +.quick-slider .slider-bin { + padding: 6px; + border-radius: 999px; } + .quick-slider .slider-bin:focus { + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 9%), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#ffffff, #36363a, 9%), 5%); } + .quick-slider .slider-bin:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 4%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #36363a, 9%), 4%), 5%); } + +.quick-toggle-menu { + border-radius: 24px; + margin: 12px 18px 0; } + .quick-toggle-menu:insensitive { + color: #ffffff; - background-color: st-mix(#ffffff, #353535, 9%); } ++ background-color: st-mix(#ffffff, #36363a, 9%); } + .quick-toggle-menu .popup-menu-item > StIcon { + -st-icon-style: symbolic; + icon-size: 1.091em; } + .quick-toggle-menu .header { + spacing-rows: 3px; + spacing-columns: 12px; + padding-bottom: 12px; } + .quick-toggle-menu .header .icon { + icon-size: 1.6365em; + border-radius: 999px; + padding: 9px; + background-color: rgba(255, 255, 255, 0.2); } + .quick-toggle-menu .header .icon.active { + background-color: -st-accent-color; + color: -st-accent-fg-color; } + +.quick-settings-system-item > StBoxLayout { + spacing: 12px; } + +.quick-settings-system-item .power-item { + min-height: 0; + min-width: 0; } + .quick-settings-system-item .power-item:insensitive { + color: #ffffff; - background-color: st-mix(#ffffff, #353535, 9%); ++ background-color: st-mix(#ffffff, #36363a, 9%); + background-color: transparent; } + +.nm-network-item .wireless-secure-icon { + icon-size: 0.5455em; } + +.bt-device-item .popup-menu-icon { + -st-icon-style: symbolic; } + +.bt-menu-placeholder.popup-menu-item { + text-align: center; + padding: 2em 4em; } + +.device-subtitle { + color: rgba(255, 255, 255, 0.5); } + +.keyboard-brightness-level { + spacing: 6px; } + +.background-apps-quick-toggle { + min-height: 2.728em; + background-color: transparent; } + .background-apps-quick-toggle StIcon { + icon-size: 1.091em !important; } + +.background-app-item .popup-menu-icon { + icon-size: 32px !important; + -st-icon-style: regular !important; } + +.background-app-item .icon-button, .background-app-item .login-dialog-button.cancel-button, .background-app-item .login-dialog-button.switch-user-button, .background-app-item .login-dialog-button.login-dialog-session-list-button, .background-app-item .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .background-app-item .pager-button, .background-app-item .message .message-header .message-expand-button, .message .message-header .background-app-item .message-expand-button, +.background-app-item .message .message-header .message-close-button, +.message .message-header .background-app-item .message-close-button, .background-app-item .screenshot-ui-show-pointer-button { + padding: 6px; + background-color: rgba(255, 255, 255, 0.13); } + .background-app-item .icon-button:hover, .background-app-item .login-dialog-button.cancel-button:hover, .background-app-item .login-dialog-button.switch-user-button:hover, .background-app-item .login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .calendar .calendar-month-header .pager-button:hover, .calendar .calendar-month-header .background-app-item .pager-button:hover, .background-app-item .message .message-header .message-expand-button:hover, .message .message-header .background-app-item .message-expand-button:hover, + .background-app-item .message .message-header .message-close-button:hover, + .message .message-header .background-app-item .message-close-button:hover, .background-app-item .screenshot-ui-show-pointer-button:hover { + background-color: rgba(255, 255, 255, 0.22); } + .background-app-item .icon-button:active, .background-app-item .login-dialog-button.cancel-button:active, .background-app-item .login-dialog-button.switch-user-button:active, .background-app-item .login-dialog-button.login-dialog-session-list-button:active, .background-app-item .calendar .calendar-month-header .pager-button:active, .calendar .calendar-month-header .background-app-item .pager-button:active, .background-app-item .message .message-header .message-expand-button:active, .message .message-header .background-app-item .message-expand-button:active, + .background-app-item .message .message-header .message-close-button:active, + .message .message-header .background-app-item .message-close-button:active, .background-app-item .screenshot-ui-show-pointer-button:active { + background-color: rgba(255, 255, 255, 0.31); } + +.background-app-item .spinner { + padding: 6px; } + +.background-app-item.popup-inactive-menu-item { + color: #ffffff; } + +/* OVERVIEW */ +.secondary-monitor-workspaces { + spacing: 12px; } + +#overviewGroup { - background-color: #282828; } ++ background-color: #222226; } + +/* Window Picker */ +.window-picker { + spacing: 6px; } + +.window-close, .screenshot-ui-close-button { - background-color: rgba(71, 71, 71, 0.98); - color: whitesmoke; ++ background-color: rgba(63, 63, 70, 0.98); ++ color: #fafafb; + border-radius: 999px; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2); + padding: 3px; + height: 32px; + width: 32px; + transition-duration: 100ms; + border: 2px solid transparent; } + .window-close StIcon, .screenshot-ui-close-button StIcon { + icon-size: 24px; } + .window-close:hover, .screenshot-ui-close-button:hover { - background-color: rgba(88, 88, 88, 0.98); } ++ background-color: rgba(80, 80, 89, 0.98); } + .window-close:active, .screenshot-ui-close-button:active { - background-color: rgba(104, 104, 104, 0.98); } ++ background-color: rgba(94, 94, 105, 0.98); } + +.workspace-background { + border-radius: 30px; + background-color: rgba(3, 2, 1, 0); + box-shadow: 0 4px 16px 4px rgba(0, 0, 0, 0.2); } + +.search-entry { + border-radius: 999px; + margin-top: 12px; + margin-bottom: 6px; + width: 24em; } + .search-entry .search-entry-icon { + icon-size: 1.091em; + margin-top: 2px; + padding: 0 4px; } + +/* Search */ +#searchResults { + margin: 0 4px; } + +#searchResultsContent { + max-width: 1044px; } + +.search-section { + spacing: 18px; } + .search-section .search-section-separator { + height: 8px; + background-color: transparent; } + +.search-section-content { - background-color: #3d3d3d; - color: whitesmoke; ++ background-color: #38383b; ++ color: #fafafb; + border-radius: 24px; + padding: 12px; + margin: 0 12px; + border: 2px solid transparent; } + +.list-search-result, .search-provider-icon { - color: whitesmoke; - background-color: #3d3d3d; ++ color: #fafafb; ++ background-color: #38383b; ++ background-color: transparent; + border-radius: 13.2px; } + .list-search-result:focus, .search-provider-icon:focus { - color: whitesmoke; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(61, 61, 61, 0.25), 5%); } ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(56, 56, 59, 0.25), 5%); } + .list-search-result:focus:hover, .search-provider-icon:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 7%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 7%), 5%); } + .list-search-result:hover, .search-provider-icon:hover { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 7%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 7%); } + .list-search-result:active, .search-provider-icon:active { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 9%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 9%); } + .list-search-result:active:hover, .search-provider-icon:active:hover { - background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#38383b, 9%), 7%); } + .list-search-result:active:focus, .search-provider-icon:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 9%), 5%); } + .list-search-result:highlighted, .search-provider-icon:highlighted, .list-search-result:selected, .search-provider-icon:selected, .list-search-result:checked, .search-provider-icon:checked { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 8%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 8%); } + .list-search-result:highlighted:hover, .search-provider-icon:highlighted:hover, .list-search-result:selected:hover, .search-provider-icon:selected:hover, .list-search-result:checked:hover, .search-provider-icon:checked:hover { - background-color: st-lighten(st-lighten(#3d3d3d, 8%), 7%); } ++ background-color: st-lighten(st-lighten(#38383b, 8%), 7%); } + .list-search-result:highlighted:active, .search-provider-icon:highlighted:active, .list-search-result:selected:active, .search-provider-icon:selected:active, .list-search-result:checked:active, .search-provider-icon:checked:active { - background-color: st-lighten(st-lighten(#3d3d3d, 8%), 9%); } ++ background-color: st-lighten(st-lighten(#38383b, 8%), 9%); } + .list-search-result:insensitive, .search-provider-icon:insensitive { - color: st-transparentize(whitesmoke, 0.5); - background-color: #3d3d3d; } ++ color: st-transparentize(#fafafb, 0.5); ++ background-color: #38383b; } + .list-search-result:drop, .search-provider-icon:drop { + background-color: st-transparentize(-st-accent-color, 0.8); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); } + +.search-statustext { - color: rgba(245, 245, 245, 0.8); } ++ color: rgba(250, 250, 251, 0.8); } + +.grid-search-results { + spacing: 30px; } + +.search-provider-icon:ltr { + margin-right: 4px; } + +.search-provider-icon:rtl { + margin-left: 4px; } + +.search-provider-icon .list-search-provider-content { + spacing: 12px; } + .search-provider-icon .list-search-provider-content .list-search-provider-details { + width: 120px; - color: whitesmoke; } ++ color: #fafafb; } + +.list-search-results { + spacing: 6px; } + +.list-search-result .list-search-result-content { + spacing: 6px; } + +.list-search-result .list-search-result-title { + spacing: 12px; } + +.list-search-result .list-search-result-description { - color: #959595; } ++ color: #949497; } + +/* Dash */ +#dash { + padding-left: 6px; + padding-right: 6px; } + #dash .dash-background { - background-color: #3d3d3d; ++ background-color: #38383b; + border-radius: 28px; + padding-top: 12px; + padding-bottom: 12px; + padding-left: 10px; + padding-right: 10px; } + #dash .dash-item-container .placeholder { + background-image: none; + background-size: contain; + height: 32px; } + #dash .dash-item-container .empty-dash-drop-target { + width: 32px; + height: 32px; } + #dash .dash-item-container .show-apps, + #dash .dash-item-container .overview-tile, + #dash .dash-item-container .grid-search-result { + margin: 0 2px; + padding-bottom: 12px; } + #dash .dash-item-container .show-apps .overview-icon, + #dash .dash-item-container .overview-tile .overview-icon, + #dash .dash-item-container .grid-search-result .overview-icon { - color: whitesmoke; - background-color: #3d3d3d; } ++ color: #fafafb; ++ background-color: #38383b; } + #dash .dash-item-container .show-apps:focus .overview-icon, + #dash .dash-item-container .overview-tile:focus .overview-icon, + #dash .dash-item-container .grid-search-result:focus .overview-icon { - color: whitesmoke; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(61, 61, 61, 0.25), 5%); } ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(56, 56, 59, 0.25), 5%); } + #dash .dash-item-container .show-apps:focus .overview-icon:hover, + #dash .dash-item-container .overview-tile:focus .overview-icon:hover, + #dash .dash-item-container .grid-search-result:focus .overview-icon:hover { - background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 7%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 7%), 5%); } + #dash .dash-item-container .show-apps:hover .overview-icon, + #dash .dash-item-container .overview-tile:hover .overview-icon, + #dash .dash-item-container .grid-search-result:hover .overview-icon { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 7%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 7%); } + #dash .dash-item-container .show-apps:active .overview-icon, + #dash .dash-item-container .overview-tile:active .overview-icon, + #dash .dash-item-container .grid-search-result:active .overview-icon { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 9%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 9%); } + #dash .dash-item-container .show-apps:active .overview-icon:hover, + #dash .dash-item-container .overview-tile:active .overview-icon:hover, + #dash .dash-item-container .grid-search-result:active .overview-icon:hover { - background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#38383b, 9%), 7%); } + #dash .dash-item-container .show-apps:active .overview-icon:focus, + #dash .dash-item-container .overview-tile:active .overview-icon:focus, + #dash .dash-item-container .grid-search-result:active .overview-icon:focus { - background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 9%), 5%); } + #dash .dash-item-container .show-apps:checked .overview-icon, + #dash .dash-item-container .overview-tile:checked .overview-icon, + #dash .dash-item-container .grid-search-result:checked .overview-icon { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 8%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 8%); } + #dash .dash-item-container .show-apps:checked .overview-icon:hover, + #dash .dash-item-container .overview-tile:checked .overview-icon:hover, + #dash .dash-item-container .grid-search-result:checked .overview-icon:hover { - background-color: st-lighten(st-lighten(#3d3d3d, 8%), 7%); } ++ background-color: st-lighten(st-lighten(#38383b, 8%), 7%); } + #dash .dash-item-container .show-apps:checked .overview-icon:active, + #dash .dash-item-container .overview-tile:checked .overview-icon:active, + #dash .dash-item-container .grid-search-result:checked .overview-icon:active { - background-color: st-lighten(st-lighten(#3d3d3d, 8%), 9%); } ++ background-color: st-lighten(st-lighten(#38383b, 8%), 9%); } + #dash .dash-item-container .app-grid-running-dot { + offset-y: -12px; } + #dash .dash-separator { + width: 1px; + margin-left: 4px; + margin-right: 4px; - background-color: rgba(245, 245, 245, 0.1); } ++ background-color: rgba(250, 250, 251, 0.1); } + #dash .dash-separator, + #dash .dash-background { + margin-bottom: 12px; } + +.dash-label { + -y-offset: 8px; } + +/* App Grid */ +.icon-grid { + row-spacing: 12px; + column-spacing: 12px; + max-row-spacing: 36px; + max-column-spacing: 36px; + page-padding-top: 24px; + page-padding-bottom: 24px; + page-padding-left: 18px; + page-padding-right: 18px; } + +/* App Icons */ +.overview-tile, .grid-search-result { - color: whitesmoke; - background-color: #282828; ++ color: #fafafb; ++ background-color: #222226; ++ background-color: transparent; + border-radius: 24px; + padding: 12px; } + .overview-tile:focus, .grid-search-result:focus { - color: whitesmoke; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.25), 5%); } ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(34, 34, 38, 0.25), 5%); } + .overview-tile:focus:hover, .grid-search-result:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(#282828, 7%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#222226, 7%), 5%); } + .overview-tile:hover, .grid-search-result:hover { - color: whitesmoke; - background-color: st-lighten(#282828, 7%); } ++ color: #fafafb; ++ background-color: st-lighten(#222226, 7%); } + .overview-tile:active, .grid-search-result:active { - color: whitesmoke; - background-color: st-lighten(#282828, 9%); } ++ color: #fafafb; ++ background-color: st-lighten(#222226, 9%); } + .overview-tile:active:hover, .grid-search-result:active:hover { - background-color: st-lighten(st-lighten(#282828, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#222226, 9%), 7%); } + .overview-tile:active:focus, .grid-search-result:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#282828, 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#222226, 9%), 5%); } + .overview-tile:highlighted, .grid-search-result:highlighted, .overview-tile:selected, .grid-search-result:selected, .overview-tile:checked, .grid-search-result:checked { - color: whitesmoke; - background-color: st-lighten(#282828, 8%); } ++ color: #fafafb; ++ background-color: st-lighten(#222226, 8%); } + .overview-tile:highlighted:hover, .grid-search-result:highlighted:hover, .overview-tile:selected:hover, .grid-search-result:selected:hover, .overview-tile:checked:hover, .grid-search-result:checked:hover { - background-color: st-lighten(st-lighten(#282828, 8%), 7%); } ++ background-color: st-lighten(st-lighten(#222226, 8%), 7%); } + .overview-tile:highlighted:active, .grid-search-result:highlighted:active, .overview-tile:selected:active, .grid-search-result:selected:active, .overview-tile:checked:active, .grid-search-result:checked:active { - background-color: st-lighten(st-lighten(#282828, 8%), 9%); } ++ background-color: st-lighten(st-lighten(#222226, 8%), 9%); } + .overview-tile:insensitive, .grid-search-result:insensitive { - color: st-transparentize(whitesmoke, 0.5); - background-color: #282828; } ++ color: st-transparentize(#fafafb, 0.5); ++ background-color: #222226; } + .overview-tile:drop, .grid-search-result:drop { + background-color: st-transparentize(-st-accent-color, 0.8); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); } + .overview-tile .overview-icon.overview-icon-with-label > StBoxLayout, .grid-search-result .overview-icon.overview-icon-with-label > StBoxLayout { + spacing: 6px; } + +.app-folder { - color: whitesmoke; - background-color: st-mix(whitesmoke, #282828, 9%); } ++ color: #fafafb; ++ background-color: st-mix(#fafafb, #222226, 9%); } + .app-folder:focus { - color: whitesmoke; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, st-mix(whitesmoke, #282828, 9%), 5%); } ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#fafafb, #222226, 9%), 5%); } + .app-folder:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 9%), 4%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #222226, 9%), 4%), 5%); } + .app-folder:hover { - color: whitesmoke; - background-color: st-lighten(st-mix(whitesmoke, #282828, 9%), 4%); } ++ color: #fafafb; ++ background-color: st-lighten(st-mix(#fafafb, #222226, 9%), 4%); } + .app-folder:active { - color: whitesmoke; - background-color: st-lighten(st-mix(whitesmoke, #282828, 9%), 9%); } ++ color: #fafafb; ++ background-color: st-lighten(st-mix(#fafafb, #222226, 9%), 9%); } + .app-folder:active:hover { - background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 9%), 9%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 9%), 9%), 4%); } + .app-folder:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 9%), 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #222226, 9%), 9%), 5%); } + .app-folder:highlighted, .app-folder:selected, .app-folder:checked { - color: whitesmoke; - background-color: st-lighten(st-mix(whitesmoke, #282828, 9%), 8%); } ++ color: #fafafb; ++ background-color: st-lighten(st-mix(#fafafb, #222226, 9%), 8%); } + .app-folder:highlighted:hover, .app-folder:selected:hover, .app-folder:checked:hover { - background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 9%), 8%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 9%), 8%), 4%); } + .app-folder:highlighted:active, .app-folder:selected:active, .app-folder:checked:active { - background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 9%), 8%), 9%); } ++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 9%), 8%), 9%); } + .app-folder:insensitive { - color: st-transparentize(whitesmoke, 0.5); - background-color: st-darken(st-mix(whitesmoke, #282828, 9%), 3%); } ++ color: st-transparentize(#fafafb, 0.5); ++ background-color: st-darken(st-mix(#fafafb, #222226, 9%), 3%); } + .app-folder:drop { + background-color: st-transparentize(-st-accent-color, 0.8); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); } + +.app-grid-running-dot { + height: 5px; + width: 5px; + border-radius: 5px; - background-color: whitesmoke; ++ background-color: #fafafb; + offset-y: 6px; } + +.app-folder-dialog-container { + padding-top: 2.2em; } + +.app-folder-dialog { + width: 720px; + height: 720px; + border-radius: 64px; - background-color: #3d3d3d; - color: whitesmoke; ++ background-color: #38383b; ++ color: #fafafb; + padding: 0 1px; - box-shadow: inset 0 0 0 1px rgba(245, 245, 245, 0.1); } ++ box-shadow: inset 0 0 0 1px rgba(250, 250, 251, 0.1); } + .app-folder-dialog .folder-name-container { + padding: 24px 36px; + padding-bottom: 0; } + .app-folder-dialog .folder-name-container .folder-name-entry { + width: 12em; } + .app-folder-dialog .icon-button, .app-folder-dialog .login-dialog-button.cancel-button, .app-folder-dialog .login-dialog-button.switch-user-button, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button, .app-folder-dialog .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .app-folder-dialog .pager-button, .app-folder-dialog .message .message-header .message-expand-button, .message .message-header .app-folder-dialog .message-expand-button, + .app-folder-dialog .message .message-header .message-close-button, + .message .message-header .app-folder-dialog .message-close-button, .app-folder-dialog .screenshot-ui-show-pointer-button { - color: whitesmoke; - background-color: st-mix(whitesmoke, #3d3d3d, 9%); } ++ color: #fafafb; ++ background-color: st-mix(#fafafb, #38383b, 9%); } + .app-folder-dialog .icon-button:hover, .app-folder-dialog .login-dialog-button.cancel-button:hover, .app-folder-dialog .login-dialog-button.switch-user-button:hover, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:hover, .app-folder-dialog .calendar .calendar-month-header .pager-button:hover, .calendar .calendar-month-header .app-folder-dialog .pager-button:hover, .app-folder-dialog .message .message-header .message-expand-button:hover, .message .message-header .app-folder-dialog .message-expand-button:hover, + .app-folder-dialog .message .message-header .message-close-button:hover, + .message .message-header .app-folder-dialog .message-close-button:hover, .app-folder-dialog .screenshot-ui-show-pointer-button:hover { - color: whitesmoke; - background-color: st-lighten(st-mix(whitesmoke, #3d3d3d, 9%), 4%); } ++ color: #fafafb; ++ background-color: st-lighten(st-mix(#fafafb, #38383b, 9%), 4%); } + .app-folder-dialog .icon-button:active, .app-folder-dialog .login-dialog-button.cancel-button:active, .app-folder-dialog .login-dialog-button.switch-user-button:active, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active, .app-folder-dialog .calendar .calendar-month-header .pager-button:active, .calendar .calendar-month-header .app-folder-dialog .pager-button:active, .app-folder-dialog .message .message-header .message-expand-button:active, .message .message-header .app-folder-dialog .message-expand-button:active, + .app-folder-dialog .message .message-header .message-close-button:active, + .message .message-header .app-folder-dialog .message-close-button:active, .app-folder-dialog .screenshot-ui-show-pointer-button:active { - color: whitesmoke; - background-color: st-lighten(st-mix(whitesmoke, #3d3d3d, 9%), 9%); } ++ color: #fafafb; ++ background-color: st-lighten(st-mix(#fafafb, #38383b, 9%), 9%); } + .app-folder-dialog .icon-button:active:hover, .app-folder-dialog .login-dialog-button.cancel-button:active:hover, .app-folder-dialog .login-dialog-button.switch-user-button:active:hover, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active:hover, .app-folder-dialog .calendar .calendar-month-header .pager-button:active:hover, .calendar .calendar-month-header .app-folder-dialog .pager-button:active:hover, .app-folder-dialog .message .message-header .message-expand-button:active:hover, .message .message-header .app-folder-dialog .message-expand-button:active:hover, + .app-folder-dialog .message .message-header .message-close-button:active:hover, + .message .message-header .app-folder-dialog .message-close-button:active:hover, .app-folder-dialog .screenshot-ui-show-pointer-button:active:hover { - background-color: st-lighten(st-lighten(st-mix(whitesmoke, #3d3d3d, 9%), 9%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #38383b, 9%), 9%), 4%); } + .app-folder-dialog .icon-button:active:focus, .app-folder-dialog .login-dialog-button.cancel-button:active:focus, .app-folder-dialog .login-dialog-button.switch-user-button:active:focus, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active:focus, .app-folder-dialog .calendar .calendar-month-header .pager-button:active:focus, .calendar .calendar-month-header .app-folder-dialog .pager-button:active:focus, .app-folder-dialog .message .message-header .message-expand-button:active:focus, .message .message-header .app-folder-dialog .message-expand-button:active:focus, + .app-folder-dialog .message .message-header .message-close-button:active:focus, + .message .message-header .app-folder-dialog .message-close-button:active:focus, .app-folder-dialog .screenshot-ui-show-pointer-button:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #3d3d3d, 9%), 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #38383b, 9%), 9%), 5%); } + .app-folder-dialog .page-indicators { + margin-bottom: 24px; } + .app-folder-dialog .page-navigation-arrow { - color: whitesmoke; - background-color: #3d3d3d; } ++ color: #fafafb; ++ background-color: #38383b; } + .app-folder-dialog .page-navigation-arrow:hover { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 7%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 7%); } + .app-folder-dialog .page-navigation-arrow:active { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 9%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 9%); } + .app-folder-dialog .page-navigation-arrow:active:hover { - background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#38383b, 9%), 7%); } + .app-folder-dialog .page-navigation-arrow:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 9%), 5%); } + .app-folder-dialog .overview-tile, .app-folder-dialog .grid-search-result { - color: whitesmoke; - background-color: #3d3d3d; } ++ color: #fafafb; ++ background-color: #38383b; ++ background-color: transparent; } + .app-folder-dialog .overview-tile:focus, .app-folder-dialog .grid-search-result:focus { - color: whitesmoke; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(61, 61, 61, 0.25), 5%); } ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(56, 56, 59, 0.25), 5%); } + .app-folder-dialog .overview-tile:focus:hover, .app-folder-dialog .grid-search-result:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 7%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 7%), 5%); } + .app-folder-dialog .overview-tile:hover, .app-folder-dialog .grid-search-result:hover { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 7%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 7%); } + .app-folder-dialog .overview-tile:active, .app-folder-dialog .grid-search-result:active { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 9%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 9%); } + .app-folder-dialog .overview-tile:active:hover, .app-folder-dialog .grid-search-result:active:hover { - background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#38383b, 9%), 7%); } + .app-folder-dialog .overview-tile:active:focus, .app-folder-dialog .grid-search-result:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 9%), 5%); } + .app-folder-dialog .overview-tile:highlighted, .app-folder-dialog .grid-search-result:highlighted, .app-folder-dialog .overview-tile:selected, .app-folder-dialog .grid-search-result:selected, .app-folder-dialog .overview-tile:checked, .app-folder-dialog .grid-search-result:checked { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 8%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 8%); } + .app-folder-dialog .overview-tile:highlighted:hover, .app-folder-dialog .grid-search-result:highlighted:hover, .app-folder-dialog .overview-tile:selected:hover, .app-folder-dialog .grid-search-result:selected:hover, .app-folder-dialog .overview-tile:checked:hover, .app-folder-dialog .grid-search-result:checked:hover { - background-color: st-lighten(st-lighten(#3d3d3d, 8%), 7%); } ++ background-color: st-lighten(st-lighten(#38383b, 8%), 7%); } + .app-folder-dialog .overview-tile:highlighted:active, .app-folder-dialog .grid-search-result:highlighted:active, .app-folder-dialog .overview-tile:selected:active, .app-folder-dialog .grid-search-result:selected:active, .app-folder-dialog .overview-tile:checked:active, .app-folder-dialog .grid-search-result:checked:active { - background-color: st-lighten(st-lighten(#3d3d3d, 8%), 9%); } ++ background-color: st-lighten(st-lighten(#38383b, 8%), 9%); } + .app-folder-dialog .overview-tile:insensitive, .app-folder-dialog .grid-search-result:insensitive { - color: st-transparentize(whitesmoke, 0.5); - background-color: #3d3d3d; } ++ color: st-transparentize(#fafafb, 0.5); ++ background-color: #38383b; } + .app-folder-dialog .overview-tile:drop, .app-folder-dialog .grid-search-result:drop { + background-color: st-transparentize(-st-accent-color, 0.8); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); } + +.rename-folder-popup .rename-folder-popup-item { + spacing: 6px; } + .rename-folder-popup .rename-folder-popup-item:ltr, .rename-folder-popup .rename-folder-popup-item:rtl { + padding: 0 12px; } + +.page-indicator { + padding: 6px 12px 0; + transition-duration: 400ms; } + .page-indicator .page-indicator-icon { + width: 10px; + height: 10px; + border-radius: 999px; - background-color: whitesmoke; ++ background-color: #fafafb; + transition-duration: 400ms; } + +.apps-scroll-view { + padding: 0; } + +.system-action-icon { - background-color: rgba(245, 245, 245, 0.1); - color: whitesmoke; ++ background-color: rgba(250, 250, 251, 0.1); ++ color: #fafafb; + border-radius: 999px; + icon-size: 48px; } + +.page-navigation-hint.dnd { + background: rgba(255, 255, 255, 0.1); } + +.page-navigation-hint.next:ltr, .page-navigation-hint.previous:rtl { + background-gradient-start: rgba(255, 255, 255, 0.05); + background-gradient-end: transparent; + background-gradient-direction: horizontal; + border-radius: 24px 0px 0px 24px; } + +.page-navigation-hint.previous:ltr, .page-navigation-hint.next:rtl { + background-gradient-start: transparent; + background-gradient-end: rgba(255, 255, 255, 0.05); + background-gradient-direction: horizontal; + border-radius: 0px 24px 24px 0px; } + +.page-navigation-arrow { + margin: 6px; + padding: 18px; + width: 24px; + height: 24px; + border-radius: 999px; + transition-duration: 100ms; - color: whitesmoke; - background-color: #282828; } ++ color: #fafafb; ++ background-color: #222226; } + .page-navigation-arrow > StIcon { - color: whitesmoke; } ++ color: #fafafb; } + .page-navigation-arrow:hover { - color: whitesmoke; - background-color: st-lighten(#282828, 7%); } ++ color: #fafafb; ++ background-color: st-lighten(#222226, 7%); } + .page-navigation-arrow:active { - color: whitesmoke; - background-color: st-lighten(#282828, 9%); } ++ color: #fafafb; ++ background-color: st-lighten(#222226, 9%); } + .page-navigation-arrow:active:hover { - background-color: st-lighten(st-lighten(#282828, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#222226, 9%), 7%); } + .page-navigation-arrow:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#282828, 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#222226, 9%), 5%); } + +/* Workspace pager */ +.workspace-thumbnails { + visible-width: 32px; + spacing: 6px; + padding: 6px; } + .workspace-thumbnails .workspace-thumbnail { - color: whitesmoke; - background-color: #4e4e4e; ++ color: #fafafb; ++ background-color: #46464e; + border-radius: 4px; + border: 1px solid transparent; } + .workspace-thumbnails .placeholder { + background-image: url("resource:///org/gnome/shell/theme/workspace-placeholder.svg"); + background-size: contain; + width: 18px; } + +.workspace-thumbnail-indicator { + border: 3px solid -st-accent-color; + border-radius: 8px; } + +.ripple-pointer-location { + width: 50px; + height: 50px; + border-radius: 25px; + background-color: st-lighten(st-transparentize(-st-accent-color, 0.7), 30%); + box-shadow: 0 0 2px 2px st-lighten(-st-accent-color, 20%); } + +.pie-timer { + width: 60px; + height: 60px; + -pie-border-width: 3px; + -pie-border-color: -st-accent-color; + -pie-background-color: st-lighten(st-transparentize(-st-accent-color, 0.7), 40%); } + +.magnifier-zoom-region { + border: 2px solid -st-accent-color; } + .magnifier-zoom-region.full-screen { + border-width: 0; } + +.select-area-rubberband { + background-color: st-transparentize(-st-accent-color, 0.7); + border: 1px solid -st-accent-color; } + +.user-icon { + background-size: contain; + border-radius: 999px; + icon-size: 64px; + background-color: rgba(255, 255, 255, 0.05); + color: #ffffff; } + .user-icon StIcon { + padding: 12px; } + .user-icon.user-avatar { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1); } + +.lightbox { + background-color: black; } + +.flashspot { + background-color: white; } + +.hidden { + color: transparent; } + +.caps-lock-warning-label { + text-align: center; + padding-bottom: 8px; - color: #f6d32d; } ++ color: #cd9309; } + +/* Workspace animation */ +.workspace-animation { - background-color: #353535; } ++ background-color: #2e2e33; } + +/* Tiled window previews */ +.tile-preview { + background-color: st-transparentize(-st-accent-color, 0.5); + border: 1px solid -st-accent-color; } + +/* On-screen Keyboard */ +#keyboard { - background-color: #353535; ++ background-color: #2e2e33; + box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.02); } + #keyboard .page-indicator { + padding: 6px; } + #keyboard .page-indicator .page-indicator-icon { + width: 8px; + height: 8px; } + +.key-container { + padding: 4px; + spacing: 4px; } + +.keyboard-key { + font-size: 1.455em; + font-weight: bold; - min-height: 1.2em; - min-width: 1.2em; - border-width: 1px; - border-style: solid; - border-radius: 10px; ++ border-radius: 0.546em; + box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.2); + color: #ffffff; + background-color: st-mix(#ffffff, #4d4d4d, 9%); } + .keyboard-key:focus { + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 9%), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#ffffff, #36363a, 9%), 5%); } + .keyboard-key:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 4%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #36363a, 9%), 4%), 5%); } + .keyboard-key:hover { + color: #ffffff; + background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 4%); } + .keyboard-key:active { + color: #ffffff; + background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%); } + .keyboard-key:active:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 4%); } + .keyboard-key:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 5%); } + .keyboard-key:checked { + color: #ffffff; + background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%); } + .keyboard-key:checked:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 4%); } + .keyboard-key:checked:active { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 9%); } - .keyboard-key:grayed { - background-color: #2d2d2d; - color: #ffffff; - border-color: rgba(255, 255, 255, 0.1); } + .keyboard-key.default-key { + color: #ffffff; + background-color: st-mix(#ffffff, #333333, 9%); - border-radius: 10px; } ++ border: none; } + .keyboard-key.default-key:hover { + color: #ffffff; + background-color: st-lighten(st-mix(#ffffff, #333333, 9%), 4%); } + .keyboard-key.default-key:active { + color: #ffffff; + background-color: st-lighten(st-mix(#ffffff, #333333, 9%), 9%); } + .keyboard-key.default-key:active:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #333333, 9%), 9%), 4%); } + .keyboard-key.default-key:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #333333, 9%), 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #333333, 9%), 9%), 5%); } + .keyboard-key.default-key:checked { + color: #ffffff; + background-color: st-lighten(st-mix(#ffffff, #333333, 9%), 8%); } + .keyboard-key.default-key:checked:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #333333, 9%), 8%), 4%); } + .keyboard-key.default-key:checked:active { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #333333, 9%), 8%), 9%); } + .keyboard-key.default-key:latched { - border-color: st-lighten(-st-accent-color, 5%); + background-color: -st-accent-color; } - .keyboard-key.enter-key { - color: -st-accent-fg-color; - background-color: st-mix(-st-accent-fg-color, -st-accent-color, 9%); - border-radius: 10px; - color: #ffffff; } - .keyboard-key.enter-key:hover { - color: -st-accent-fg-color; - background-color: st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 4%); } - .keyboard-key.enter-key:active { - color: -st-accent-fg-color; - background-color: st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 9%); } - .keyboard-key.enter-key:active:hover { - background-color: st-lighten(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 9%), 4%); } - .keyboard-key.enter-key:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 9%), 5%); } - .keyboard-key.enter-key:checked { - color: -st-accent-fg-color; - background-color: st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 8%); } - .keyboard-key.enter-key:checked:hover { - background-color: st-lighten(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 8%), 4%); } - .keyboard-key.enter-key:checked:active { - background-color: st-lighten(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 8%), 9%); } - .keyboard-key.shift-key-uppercase { - background-color: gray; - color: #353535; } - .keyboard-key.shift-key-uppercase:hover { - background-color: #8c8c8c; - color: #424242; } + .keyboard-key StIcon { - icon-size: 24px; } ++ icon-size: 1.6365em; } + - .keyboard-subkeys { - -arrow-border-radius: 16px; - -arrow-background-color: #353535; ++.keyboard-subkeys-boxpointer { ++ -arrow-border-radius: 22px; ++ -arrow-background-color: #2e2e33; + -arrow-border-width: 1px; - -arrow-border-color: #4c4c4c; ++ -arrow-border-color: #44444c; + -arrow-base: 20px; + -arrow-rise: 10px; - -boxpointer-gap: 6px; - padding: 6px; } - .keyboard-subkeys .keyboard-key { - color: #ffffff; - background-color: st-mix(#ffffff, #4d4d4d, 9%); - border-radius: 10px; } - .keyboard-subkeys .keyboard-key:focus { - color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 9%), 5%); } - .keyboard-subkeys .keyboard-key:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 4%), 5%); } - .keyboard-subkeys .keyboard-key:hover { - color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 4%); } - .keyboard-subkeys .keyboard-key:active { - color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%); } - .keyboard-subkeys .keyboard-key:active:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 4%); } - .keyboard-subkeys .keyboard-key:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 5%); } - .keyboard-subkeys .keyboard-key:checked { - color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%); } - .keyboard-subkeys .keyboard-key:checked:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 4%); } - .keyboard-subkeys .keyboard-key:checked:active { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 9%); } ++ -boxpointer-gap: 4px; ++ border-radius: 22px; ++ box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.1); } ++ .keyboard-subkeys-boxpointer .key-container { ++ padding: 12px; ++ spacing: 8px; } + +.emoji-page .keyboard-key { + background-color: transparent; + border: none; + color: initial; } + +.emoji-panel .keyboard-key:latched { + border-color: st-lighten(-st-accent-color, 5%); + background-color: -st-accent-color; } + +.word-suggestions { + spacing: 12px; + min-height: 17pt; + padding: 12px; + color: #ffffff; } + .word-suggestions StButton { + margin: 0 3px; + min-width: 32px; + border-radius: 4px; - padding: 0px 18px; ++ padding: 6px 18px; + background-color: transparent; + border-color: transparent; + box-shadow: none; } + .word-suggestions StButton:insensitive { + background-color: transparent !important; } + .word-suggestions StButton:focus { + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 9%), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#ffffff, #36363a, 9%), 5%); } + .word-suggestions StButton:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 4%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #36363a, 9%), 4%), 5%); } + .word-suggestions StButton:hover { + color: #ffffff; + background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 4%); } + .word-suggestions StButton:active { + color: #ffffff; + background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%); } + .word-suggestions StButton:active:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 4%); } + .word-suggestions StButton:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 5%); } + .word-suggestions StButton:checked { + color: #ffffff; + background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%); } + .word-suggestions StButton:checked:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 4%); } + .word-suggestions StButton:checked:active { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 9%); } + +/* Looking Glass */ +.lg-dialog StEntry { + min-height: 1.5em; } + +.lg-dialog .shell-link { + color: st-lighten(-st-accent-color, 20%); } + .lg-dialog .shell-link:hover { + color: st-lighten(st-lighten(-st-accent-color, 20%), 10%); } + .lg-dialog .shell-link:active { + color: st-darken(st-lighten(-st-accent-color, 20%), 10%); } + +.lg-dialog .actor-link { + color: st-darken(#ffffff, 20%); } + .lg-dialog .actor-link:hover { + color: #ffffff; } + .lg-dialog .actor-link:active { + color: st-lighten(#ffffff, 20%); } + .lg-dialog .actor-link StIcon { + icon-size: 12px; } + +.lg-completions-text { + font-style: italic; } + +#LookingGlassDialog { - background-color: rgba(53, 53, 53, 0.98); ++ background-color: rgba(46, 46, 51, 0.98); + color: #ffffff; + border-radius: 16px; + margin-top: 4px; + border: 2px solid transparent; + padding: 6px; + spacing: 6px; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2); } + #LookingGlassDialog > #Toolbar { + border: none; + padding: 6px; + border-radius: 0; + background-color: transparent; + spacing: 6px; } + #LookingGlassDialog > #Toolbar .lg-toolbar-button { + padding: 6px 12px; } + #LookingGlassDialog > #Toolbar .lg-toolbar-button > StIcon { + icon-size: 16px; } + #LookingGlassDialog .labels { + spacing: 6px; } + #LookingGlassDialog .notebook-tab { + background-color: transparent; + -natural-hpadding: 12px; + -minimum-hpadding: 12px; + padding: 6px 12px; } + #LookingGlassDialog .notebook-tab:selected { + color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 9%); } ++ background-color: st-lighten(st-mix(#ffffff, #2e2e33, 9%), 9%); } + #LookingGlassDialog .notebook-tab:selected:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 9%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 9%), 9%), 4%); } + #LookingGlassDialog .notebook-tab:selected:focus { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #2e2e33, 9%), 9%), 5%); } + +#LookingGlassPropertyInspector { - background-color: #353535; ++ background-color: #2e2e33; + color: #ffffff; + border-radius: 16px; + border: 1px solid rgba(255, 255, 255, 0.1); + padding: 12px; } + #LookingGlassPropertyInspector .lg-obj-inspector-title { + spacing: 4px; } + #LookingGlassPropertyInspector .lg-obj-inspector-close-button, + #LookingGlassPropertyInspector .lg-obj-inspector-button { + padding: 6px 12px; } + #LookingGlassPropertyInspector .lg-obj-inspector-close-button { + margin: 4px; + padding: 6px; + border-radius: 999px; } + #LookingGlassPropertyInspector .lg-obj-inspector-close-button > StIcon { + icon-size: 16px; } + +#LookingGlassEvaluator { + padding: 6px; } + #LookingGlassEvaluator .evaluator-results { + spacing: 6px; } + +#LookingGlassWindows { + padding: 6px; + spacing: 6px; } + #LookingGlassWindows .lg-window { + color: #ffffff; - background-color: st-mix(#ffffff, #353535, 9%); ++ background-color: st-mix(#ffffff, #2e2e33, 9%); + margin: 0; + padding: 12px; } + +#LookingGlassExtensions .lg-extensions-list { + padding: 6px; + spacing: 6px; } + +#LookingGlassExtensions .lg-extension { + color: #ffffff; - background-color: st-mix(#ffffff, #353535, 9%); ++ background-color: st-mix(#ffffff, #2e2e33, 9%); + margin: 0; + spacing: 4px; + padding: 12px; } + #LookingGlassExtensions .lg-extension .lg-extension-name { + color: #ffffff !important; } + #LookingGlassExtensions .lg-extension .lg-extension-meta { + spacing: 12px; } + +#LookingGlassExtensions .lg-extensions-none { + color: rgba(255, 255, 255, 0.5); } + +#LookingGlassActors { + padding: 6px; + spacing: 4px; } + +#LookingGlassDebugFlags .lg-debug-flags-header { + padding: 6px; + padding-top: 12px; } + +#LookingGlassDebugFlags .lg-debug-flag-button { + padding: 9px 12px; + margin-bottom: 6px; } + #LookingGlassDebugFlags .lg-debug-flag-button StLabel { + font-weight: normal !important; } + #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch { + background: rgba(255, 255, 255, 0.15); } + #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:hover { + background: rgba(255, 255, 255, 0.2); } + #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:checked { + background: -st-accent-color; + color: -st-accent-fg-color; } + #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:checked:hover { + background-color: st-lighten(-st-accent-color, 5%); + color: st-lighten(-st-accent-fg-color, 5%); } + +.login-dialog, +.unlock-dialog { - color: whitesmoke; } ++ color: #fafafb; } + .login-dialog .caps-lock-warning-label, + .login-dialog .login-dialog-message-warning, + .unlock-dialog .caps-lock-warning-label, + .unlock-dialog .login-dialog-message-warning { - color: whitesmoke; } ++ color: #fafafb; } + .login-dialog .login-dialog-prompt-layout, + .unlock-dialog .login-dialog-prompt-layout { + width: 25em; + spacing: 9px; } + +.login-dialog-button.cancel-button { + padding: 9px; } + +.login-dialog-button-box { + spacing: 12px; } + +.conflicting-session-dialog-content { + spacing: 20px; } + .conflicting-session-dialog-content .conflicting-session-dialog-title { + text-align: center; + margin-bottom: 5px; } + .conflicting-session-dialog-content .conflicting-session-dialog-desc { + text-align: center; } + .conflicting-session-dialog-content .conflicting-session-dialog-desc-warning { + text-align: center; - color: #f6d32d; } ++ color: #cd9309; } + +.login-dialog-logo-bin { + margin: 3em 0; } + +.login-dialog-banner-view { + max-width: 25em; } + .login-dialog-banner-view .login-dialog-banner { - color: gainsboro; } ++ color: #dedee4; } + +.login-dialog-message { + text-align: center; } + +.login-dialog-message-hint, .login-dialog-message { - color: gainsboro; ++ color: #dedee4; + min-height: 2.75em; } + +.login-dialog-user-selection-box { + padding-top: 4em; + padding-bottom: 8em; } + +.login-dialog-not-listed-label { + padding: 6px; } + +.login-dialog-not-listed-button { - color: whitesmoke; - background-color: #282828; ++ color: #fafafb; ++ background-color: #222226; + padding: 0 6px; + margin: 6px; } + .login-dialog-not-listed-button:focus { - color: whitesmoke; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.25), 5%); } ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(34, 34, 38, 0.25), 5%); } + .login-dialog-not-listed-button:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(#282828, 7%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#222226, 7%), 5%); } + .login-dialog-not-listed-button:hover { - color: whitesmoke; - background-color: st-lighten(#282828, 7%); } ++ color: #fafafb; ++ background-color: st-lighten(#222226, 7%); } + .login-dialog-not-listed-button:active { - color: whitesmoke; - background-color: st-lighten(#282828, 9%); } ++ color: #fafafb; ++ background-color: st-lighten(#222226, 9%); } + .login-dialog-not-listed-button:active:hover { - background-color: st-lighten(st-lighten(#282828, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#222226, 9%), 7%); } + .login-dialog-not-listed-button:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#282828, 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#222226, 9%), 5%); } + +.login-dialog-auth-list-view { + -st-vfade-offset: 3em; } + +.login-dialog-auth-list { + spacing: 6px; + margin-left: 2em; } + +.login-dialog-auth-list-title { + margin-left: 2em; } + +.login-dialog-auth-list-item { + border-radius: 16px; + padding: 4px; - color: darkgray; } ++ color: #a5a5b7; } + .login-dialog-auth-list-item:focus, .login-dialog-auth-list-item:selected { + background-color: -st-accent-color; + color: -st-accent-fg-color; } + +.login-dialog-auth-list-label:ltr { + padding-left: 15px; + text-align: left; } + +.login-dialog-auth-list-label:rtl { + padding-right: 15px; + text-align: right; } + +.login-dialog-user-list-view { + width: 25em; + -st-vfade-offset: 3em; } + .login-dialog-user-list-view .login-dialog-user-list { + margin: 0 8px; + spacing: 12px; } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item { - color: whitesmoke; - background-color: st-mix(whitesmoke, #282828, 9%); ++ color: #fafafb; ++ background-color: st-mix(#fafafb, #222226, 9%); + border-radius: 16px; + padding: 9px; } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:selected, .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:focus { - color: whitesmoke; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, st-mix(whitesmoke, #282828, 9%), 5%); } ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#fafafb, #222226, 9%), 5%); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:selected:hover, .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 9%), 4%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #222226, 9%), 4%), 5%); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:hover { - color: whitesmoke; - background-color: st-lighten(st-mix(whitesmoke, #282828, 9%), 4%); } ++ color: #fafafb; ++ background-color: st-lighten(st-mix(#fafafb, #222226, 9%), 4%); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active { - color: whitesmoke; - background-color: st-lighten(st-mix(whitesmoke, #282828, 9%), 9%); } ++ color: #fafafb; ++ background-color: st-lighten(st-mix(#fafafb, #222226, 9%), 9%); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active:hover { - background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 9%), 9%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 9%), 9%), 4%); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 9%), 9%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #222226, 9%), 9%), 5%); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item .user-icon { + border: 2px solid transparent; } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item .login-dialog-timed-login-indicator { + height: 2px; + margin-top: 6px; - background-color: rgba(245, 245, 245, 0.7); } ++ background-color: rgba(250, 250, 251, 0.7); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:logged-in .user-icon { + border-color: -st-accent-color; } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:logged-in .user-icon StIcon { + background-color: st-transparentize(-st-accent-color, 0.7); } + +.unlock-dialog { + background-color: transparent; } + +.screen-shield-background { + background: black; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.6); } + +#lockDialogGroup { - background-color: #282828; } ++ background-color: #222226; } + +.unlock-dialog-clock { - color: whitesmoke; ++ color: #fafafb; + spacing: 2em; } + .unlock-dialog-clock .unlock-dialog-clock-time { + font-size: 6.546em; + font-weight: 800; } + .unlock-dialog-clock .unlock-dialog-clock-date { + font-weight: 400; } + .unlock-dialog-clock .unlock-dialog-clock-hint { + margin-top: 2em; + padding: 6px 18px; + border-radius: 16px; + font-weight: bold; } + +#unlockDialogNotifications StButton#vhandle, #unlockDialogNotifications StButton#hhandle { - background-color: rgba(53, 53, 53, 0.3); } ++ background-color: rgba(54, 54, 58, 0.3); } + #unlockDialogNotifications StButton#vhandle:hover, #unlockDialogNotifications StButton#vhandle:focus, #unlockDialogNotifications StButton#hhandle:hover, #unlockDialogNotifications StButton#hhandle:focus { - background-color: rgba(53, 53, 53, 0.5); } ++ background-color: rgba(54, 54, 58, 0.5); } + #unlockDialogNotifications StButton#vhandle:active, #unlockDialogNotifications StButton#hhandle:active { + background-color: st-transparentize(-st-accent-color, 0.5); } + +.unlock-dialog-notifications-container { + margin: 12px; + spacing: 6px; + width: 25em; + background-color: transparent; } + .unlock-dialog-notifications-container .summary-notification-stack-scrollview { + padding-top: 0; + padding-bottom: 0; } + .unlock-dialog-notifications-container .notification, + .unlock-dialog-notifications-container .unlock-dialog-notification-source { + padding: 12px 16px; + border: none; - background-color: rgba(245, 245, 245, 0.1); - color: whitesmoke; ++ background-color: rgba(250, 250, 251, 0.1); ++ color: #fafafb; + border-radius: 16px; } + .unlock-dialog-notifications-container .notification.critical, + .unlock-dialog-notifications-container .unlock-dialog-notification-source.critical { - background-color: rgba(245, 245, 245, 0.2); } ++ background-color: rgba(250, 250, 251, 0.2); } + +.unlock-dialog-notification-icon { + icon-size: 32px; } + +.unlock-dialog-notification-label { + padding-left: 12px; + padding-right: 0; } + .unlock-dialog-notification-label:rtl { + padding-right: 12px; + padding-left: 0; } + +.unlock-dialog-notification-count-text { + font-weight: bold; + padding: 0 12px; - color: whitesmoke; - background-color: rgba(245, 245, 245, 0.1); ++ color: #fafafb; ++ background-color: rgba(250, 250, 251, 0.1); + border-radius: 999px; } + +.login-dialog .user-widget .user-widget-label, +.unlock-dialog .user-widget .user-widget-label { - color: whitesmoke; } ++ color: #fafafb; } + +.login-dialog .user-widget .user-icon, +.unlock-dialog .user-widget .user-icon { - background-color: rgba(245, 245, 245, 0.13); - color: whitesmoke; } ++ background-color: rgba(250, 250, 251, 0.13); ++ color: #fafafb; } + +.login-dialog .user-widget.horizontal, +.unlock-dialog .user-widget.horizontal { + spacing: 18px; } + +.login-dialog .user-widget.vertical, +.unlock-dialog .user-widget.vertical { + spacing: 24px; } + .login-dialog .user-widget.vertical .user-widget-label, + .unlock-dialog .user-widget.vertical .user-widget-label { + font-weight: 400; + font-size: 1.818em; + text-align: center; + margin-bottom: .75em; } + .login-dialog .user-widget.vertical .user-icon, + .unlock-dialog .user-widget.vertical .user-icon { + icon-size: 160px; } + .login-dialog .user-widget.vertical .user-icon StIcon, + .unlock-dialog .user-widget.vertical .user-icon StIcon { + padding: 30px; } diff --cc data/theme/gnome-shell-high-contrast.css index 8ce52ba4f,000000000..3bc958979 mode 100644,000000..100644 --- a/data/theme/gnome-shell-high-contrast.css +++ b/data/theme/gnome-shell-high-contrast.css @@@ -1,3570 -1,0 +1,3549 @@@ +/* This stylesheet is generated, DO NOT EDIT */ +/* Copyright 2009, 2015 Red Hat, Inc. + * + * Portions adapted from Mx's data/style/default.css + * Copyright 2009 Intel Corporation + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU Lesser General Public License, + * version 2.1, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for + * more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* Global Values */ +stage { + font-size: 1em; + color: #ffffff; } + +/* Common Stylings */ +#dash .dash-item-container .show-apps, +#dash .dash-item-container .overview-tile, +#dash .dash-item-container .grid-search-result { + background: none; + box-shadow: none; + border: none; + border-radius: 0; + padding: 0; + margin: 0; } + +.app-folder-dialog .overview-tile, .app-folder-dialog .grid-search-result, .app-folder, .overview-tile, .grid-search-result, #dash .dash-item-container .show-apps .overview-icon, +#dash .dash-item-container .overview-tile .overview-icon, +#dash .dash-item-container .grid-search-result .overview-icon, .list-search-result, .search-provider-icon, .switcher-list .item-box, .audio-device-selection-dialog .audio-selection-box .audio-selection-device { + border-radius: 16px; + padding: 6px; + spacing: 6px; + text-align: center; + transition-duration: 100ms; } + +.login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item, .login-dialog-not-listed-button, .unlock-dialog .button, +.unlock-dialog .icon-button, +.unlock-dialog .message .message-header .message-expand-button, +.message .message-header .unlock-dialog .message-expand-button, +.unlock-dialog .message .message-header .message-close-button, +.message .message-header .unlock-dialog .message-close-button, +.unlock-dialog .screenshot-ui-show-pointer-button, #LookingGlassDialog .notebook-tab, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button, #LookingGlassDebugFlags .lg-debug-flag-button, #LookingGlassPropertyInspector .lg-obj-inspector-close-button, +#LookingGlassPropertyInspector .lg-obj-inspector-button, #LookingGlassDialog > #Toolbar .lg-toolbar-button, .icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .message .message-header .message-expand-button, +.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button, .button { + border-radius: 8px; + padding: 3px 24px; + font-weight: bold; + transition: border-width 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94), box-shadow 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94); } + +.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .screenshot-ui-show-pointer-button, .message .message-header .message-expand-button, +.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button, .button { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%); } + .icon-button:focus, .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus, .screenshot-ui-show-pointer-button:focus, .message .message-header .message-expand-button:focus, + .message .message-header .message-close-button:focus, .calendar .calendar-month-header .pager-button:focus, .button:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); } + .icon-button:focus:hover, .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .message .message-header .message-expand-button:focus:hover, + .message .message-header .message-close-button:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .button:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); } + .icon-button:hover, .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover, .screenshot-ui-show-pointer-button:hover, .message .message-header .message-expand-button:hover, + .message .message-header .message-close-button:hover, .calendar .calendar-month-header .pager-button:hover, .button:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%); } + .icon-button:insensitive, .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive, .screenshot-ui-show-pointer-button:insensitive, .message .message-header .message-expand-button:insensitive, + .message .message-header .message-close-button:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .button:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: st-transparentize(#ffffff, 0.5); + background-color: st-darken(st-mix(#ffffff, #1a1a1a, 9%), 3%); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + .icon-button:selected, .login-dialog-button.cancel-button:selected, .login-dialog-button.switch-user-button:selected, .login-dialog-button.login-dialog-session-list-button:selected, .screenshot-ui-show-pointer-button:selected, .message .message-header .message-expand-button:selected, + .message .message-header .message-close-button:selected, .calendar .calendar-month-header .pager-button:selected, .button:selected, .icon-button:active, .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active, .screenshot-ui-show-pointer-button:active, .message .message-header .message-expand-button:active, + .message .message-header .message-close-button:active, .calendar .calendar-month-header .pager-button:active, .button:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 9%), #ffffff, 87%); } + .icon-button:selected:hover, .login-dialog-button.cancel-button:selected:hover, .login-dialog-button.switch-user-button:selected:hover, .login-dialog-button.login-dialog-session-list-button:selected:hover, .screenshot-ui-show-pointer-button:selected:hover, .message .message-header .message-expand-button:selected:hover, + .message .message-header .message-close-button:selected:hover, .calendar .calendar-month-header .pager-button:selected:hover, .button:selected:hover, .icon-button:active:hover, .login-dialog-button.cancel-button:active:hover, .login-dialog-button.switch-user-button:active:hover, .login-dialog-button.login-dialog-session-list-button:active:hover, .screenshot-ui-show-pointer-button:active:hover, .message .message-header .message-expand-button:active:hover, + .message .message-header .message-close-button:active:hover, .calendar .calendar-month-header .pager-button:active:hover, .button:active:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 9%), 4%); } + .icon-button:selected:focus, .login-dialog-button.cancel-button:selected:focus, .login-dialog-button.switch-user-button:selected:focus, .login-dialog-button.login-dialog-session-list-button:selected:focus, .screenshot-ui-show-pointer-button:selected:focus, .message .message-header .message-expand-button:selected:focus, + .message .message-header .message-close-button:selected:focus, .calendar .calendar-month-header .pager-button:selected:focus, .button:selected:focus, .icon-button:active:focus, .login-dialog-button.cancel-button:active:focus, .login-dialog-button.switch-user-button:active:focus, .login-dialog-button.login-dialog-session-list-button:active:focus, .screenshot-ui-show-pointer-button:active:focus, .message .message-header .message-expand-button:active:focus, + .message .message-header .message-close-button:active:focus, .calendar .calendar-month-header .pager-button:active:focus, .button:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 9%), #ffffff, 87%), 5%); } + .icon-button:checked, .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked, .screenshot-ui-show-pointer-button:checked, .message .message-header .message-expand-button:checked, + .message .message-header .message-close-button:checked, .calendar .calendar-month-header .pager-button:checked, .button:checked { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), #ffffff, 87%); } + .icon-button:checked:hover, .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .message .message-header .message-expand-button:checked:hover, + .message .message-header .message-close-button:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .button:checked:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 4%); } + .icon-button:checked:active, .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active, .screenshot-ui-show-pointer-button:checked:active, .message .message-header .message-expand-button:checked:active, + .message .message-header .message-close-button:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .button:checked:active { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 9%); } + +.calendar .calendar-day-heading, .calendar .calendar-day, .calendar .calendar-month-header .calendar-month-label, .icon-button.flat, .flat.login-dialog-button.cancel-button, .flat.login-dialog-button.switch-user-button, .flat.login-dialog-button.login-dialog-session-list-button, .flat.screenshot-ui-show-pointer-button, .message .message-header .flat.message-expand-button, +.message .message-header .flat.message-close-button, .calendar .calendar-month-header .pager-button, .button.flat { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: #1a1a1a; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + .calendar .calendar-day-heading:focus, .calendar .calendar-day:focus, .calendar .calendar-month-header .calendar-month-label:focus, .icon-button.flat:focus, .flat.login-dialog-button.cancel-button:focus, .flat.login-dialog-button.switch-user-button:focus, .flat.login-dialog-button.login-dialog-session-list-button:focus, .flat.screenshot-ui-show-pointer-button:focus, .message .message-header .flat.message-expand-button:focus, + .message .message-header .flat.message-close-button:focus, .calendar .calendar-month-header .pager-button:focus, .button.flat:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, rgba(26, 26, 26, 0.25), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(26, 26, 26, 0.25), 5%); } + .calendar .calendar-day-heading:focus:hover, .calendar .calendar-day:focus:hover, .calendar .calendar-month-header .calendar-month-label:focus:hover, .icon-button.flat:focus:hover, .flat.login-dialog-button.cancel-button:focus:hover, .flat.login-dialog-button.switch-user-button:focus:hover, .flat.login-dialog-button.login-dialog-session-list-button:focus:hover, .flat.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .flat.message-expand-button:focus:hover, + .message .message-header .flat.message-close-button:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .button.flat:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#1a1a1a, 7%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#1a1a1a, 7%), #ffffff, 87%), 5%); } + .calendar .calendar-day-heading:hover, .calendar .calendar-day:hover, .calendar .calendar-month-header .calendar-month-label:hover, .icon-button.flat:hover, .flat.login-dialog-button.cancel-button:hover, .flat.login-dialog-button.switch-user-button:hover, .flat.login-dialog-button.login-dialog-session-list-button:hover, .flat.screenshot-ui-show-pointer-button:hover, .message .message-header .flat.message-expand-button:hover, + .message .message-header .flat.message-close-button:hover, .calendar .calendar-month-header .pager-button:hover, .button.flat:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#1a1a1a, 7%), #ffffff, 87%); } + .calendar .calendar-day-heading:insensitive, .calendar .calendar-day:insensitive, .calendar .calendar-month-header .calendar-month-label:insensitive, .icon-button.flat:insensitive, .flat.login-dialog-button.cancel-button:insensitive, .flat.login-dialog-button.switch-user-button:insensitive, .flat.login-dialog-button.login-dialog-session-list-button:insensitive, .flat.screenshot-ui-show-pointer-button:insensitive, .message .message-header .flat.message-expand-button:insensitive, + .message .message-header .flat.message-close-button:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .button.flat:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: st-transparentize(#ffffff, 0.5); + background-color: #1a1a1a; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + .calendar .calendar-day-heading:selected, .calendar .calendar-day:selected, .calendar .calendar-month-header .calendar-month-label:selected, .icon-button.flat:selected, .flat.login-dialog-button.cancel-button:selected, .flat.login-dialog-button.switch-user-button:selected, .flat.login-dialog-button.login-dialog-session-list-button:selected, .flat.screenshot-ui-show-pointer-button:selected, .message .message-header .flat.message-expand-button:selected, + .message .message-header .flat.message-close-button:selected, .calendar .calendar-month-header .pager-button:selected, .button.flat:selected, .calendar .calendar-day-heading:active, .calendar .calendar-day:active, .calendar .calendar-month-header .calendar-month-label:active, .icon-button.flat:active, .flat.login-dialog-button.cancel-button:active, .flat.login-dialog-button.switch-user-button:active, .flat.login-dialog-button.login-dialog-session-list-button:active, .flat.screenshot-ui-show-pointer-button:active, .message .message-header .flat.message-expand-button:active, + .message .message-header .flat.message-close-button:active, .calendar .calendar-month-header .pager-button:active, .button.flat:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%); } + .calendar .calendar-day-heading:selected:hover, .calendar .calendar-day:selected:hover, .calendar .calendar-month-header .calendar-month-label:selected:hover, .icon-button.flat:selected:hover, .flat.login-dialog-button.cancel-button:selected:hover, .flat.login-dialog-button.switch-user-button:selected:hover, .flat.login-dialog-button.login-dialog-session-list-button:selected:hover, .flat.screenshot-ui-show-pointer-button:selected:hover, .message .message-header .flat.message-expand-button:selected:hover, + .message .message-header .flat.message-close-button:selected:hover, .calendar .calendar-month-header .pager-button:selected:hover, .button.flat:selected:hover, .calendar .calendar-day-heading:active:hover, .calendar .calendar-day:active:hover, .calendar .calendar-month-header .calendar-month-label:active:hover, .icon-button.flat:active:hover, .flat.login-dialog-button.cancel-button:active:hover, .flat.login-dialog-button.switch-user-button:active:hover, .flat.login-dialog-button.login-dialog-session-list-button:active:hover, .flat.screenshot-ui-show-pointer-button:active:hover, .message .message-header .flat.message-expand-button:active:hover, + .message .message-header .flat.message-close-button:active:hover, .calendar .calendar-month-header .pager-button:active:hover, .button.flat:active:hover { + background-color: st-lighten(st-lighten(#1a1a1a, 9%), 7%); } + .calendar .calendar-day-heading:selected:focus, .calendar .calendar-day:selected:focus, .calendar .calendar-month-header .calendar-month-label:selected:focus, .icon-button.flat:selected:focus, .flat.login-dialog-button.cancel-button:selected:focus, .flat.login-dialog-button.switch-user-button:selected:focus, .flat.login-dialog-button.login-dialog-session-list-button:selected:focus, .flat.screenshot-ui-show-pointer-button:selected:focus, .message .message-header .flat.message-expand-button:selected:focus, + .message .message-header .flat.message-close-button:selected:focus, .calendar .calendar-month-header .pager-button:selected:focus, .button.flat:selected:focus, .calendar .calendar-day-heading:active:focus, .calendar .calendar-day:active:focus, .calendar .calendar-month-header .calendar-month-label:active:focus, .icon-button.flat:active:focus, .flat.login-dialog-button.cancel-button:active:focus, .flat.login-dialog-button.switch-user-button:active:focus, .flat.login-dialog-button.login-dialog-session-list-button:active:focus, .flat.screenshot-ui-show-pointer-button:active:focus, .message .message-header .flat.message-expand-button:active:focus, + .message .message-header .flat.message-close-button:active:focus, .calendar .calendar-month-header .pager-button:active:focus, .button.flat:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%), 5%); } + .calendar .calendar-day-heading:checked, .calendar .calendar-day:checked, .calendar .calendar-month-header .calendar-month-label:checked, .icon-button.flat:checked, .flat.login-dialog-button.cancel-button:checked, .flat.login-dialog-button.switch-user-button:checked, .flat.login-dialog-button.login-dialog-session-list-button:checked, .flat.screenshot-ui-show-pointer-button:checked, .message .message-header .flat.message-expand-button:checked, + .message .message-header .flat.message-close-button:checked, .calendar .calendar-month-header .pager-button:checked, .button.flat:checked { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#1a1a1a, 8%), #ffffff, 87%); } + .calendar .calendar-day-heading:checked:hover, .calendar .calendar-day:checked:hover, .calendar .calendar-month-header .calendar-month-label:checked:hover, .icon-button.flat:checked:hover, .flat.login-dialog-button.cancel-button:checked:hover, .flat.login-dialog-button.switch-user-button:checked:hover, .flat.login-dialog-button.login-dialog-session-list-button:checked:hover, .flat.screenshot-ui-show-pointer-button:checked:hover, .message .message-header .flat.message-expand-button:checked:hover, + .message .message-header .flat.message-close-button:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .button.flat:checked:hover { + background-color: st-lighten(st-lighten(#1a1a1a, 8%), 7%); } + .calendar .calendar-day-heading:checked:active, .calendar .calendar-day:checked:active, .calendar .calendar-month-header .calendar-month-label:checked:active, .icon-button.flat:checked:active, .flat.login-dialog-button.cancel-button:checked:active, .flat.login-dialog-button.switch-user-button:checked:active, .flat.login-dialog-button.login-dialog-session-list-button:checked:active, .flat.screenshot-ui-show-pointer-button:checked:active, .message .message-header .flat.message-expand-button:checked:active, + .message .message-header .flat.message-close-button:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .button.flat:checked:active { + background-color: st-lighten(st-lighten(#1a1a1a, 8%), 9%); } + - .keyboard-brightness-level .button:checked, .quick-menu-toggle .quick-toggle-arrow:checked, .quick-toggle:checked, .calendar .calendar-day.calendar-today, .icon-button.default, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .default.screenshot-ui-show-pointer-button, .message .message-header .default.message-expand-button, ++.keyboard-brightness-level .button:checked, .quick-toggle:checked, .calendar .calendar-day.calendar-today, .icon-button.default, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .default.screenshot-ui-show-pointer-button, .message .message-header .default.message-expand-button, +.message .message-header .default.message-close-button, .calendar .calendar-month-header .default.pager-button, .button.default { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; + color: -st-accent-fg-color; + background-color: st-mix(-st-accent-color, #ffffff, 87%); } - .keyboard-brightness-level .button:focus:checked, .quick-menu-toggle .quick-toggle-arrow:focus:checked, .quick-toggle:focus:checked, .calendar .calendar-day.calendar-today:focus, .icon-button.default:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .default.screenshot-ui-show-pointer-button:focus, .message .message-header .default.message-expand-button:focus, ++ .keyboard-brightness-level .button:focus:checked, .quick-toggle:focus:checked, .calendar .calendar-day.calendar-today:focus, .icon-button.default:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .default.screenshot-ui-show-pointer-button:focus, .message .message-header .default.message-expand-button:focus, + .message .message-header .default.message-close-button:focus, .calendar .calendar-month-header .default.pager-button:focus, .button.default:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; + color: -st-accent-fg-color; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - box-shadow: inset 0 0 0 2px st-lighten(-st-accent-color, 30%) !important; - background-color: st-mix(-st-accent-color, st-mix(-st-accent-color, #ffffff, 87%), 5%); } - .keyboard-brightness-level .button:focus:hover:checked, .quick-menu-toggle .quick-toggle-arrow:focus:hover:checked, .quick-toggle:focus:hover:checked, .calendar .calendar-day.calendar-today:focus:hover, .icon-button.default:focus:hover, .default.login-dialog-button.cancel-button:focus:hover, .default.login-dialog-button.switch-user-button:focus:hover, .default.login-dialog-button.login-dialog-session-list-button:focus:hover, .default.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .default.message-expand-button:focus:hover, ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ box-shadow: inset 0 0 0 2px st-transparentize(st-lighten(-st-accent-color, 30%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(-st-accent-color, #ffffff, 87%), 5%); } ++ .keyboard-brightness-level .button:focus:hover:checked, .quick-toggle:focus:hover:checked, .calendar .calendar-day.calendar-today:focus:hover, .icon-button.default:focus:hover, .default.login-dialog-button.cancel-button:focus:hover, .default.login-dialog-button.switch-user-button:focus:hover, .default.login-dialog-button.login-dialog-session-list-button:focus:hover, .default.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .default.message-expand-button:focus:hover, + .message .message-header .default.message-close-button:focus:hover, .calendar .calendar-month-header .default.pager-button:focus:hover, .button.default:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(-st-accent-color, 4%), #ffffff, 87%), 5%); } - .keyboard-brightness-level .button:hover:checked, .quick-menu-toggle .quick-toggle-arrow:hover:checked, .quick-toggle:hover:checked, .calendar .calendar-day.calendar-today:hover, .icon-button.default:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .default.screenshot-ui-show-pointer-button:hover, .message .message-header .default.message-expand-button:hover, ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(-st-accent-color, 4%), #ffffff, 87%), 5%); } ++ .keyboard-brightness-level .button:hover:checked, .quick-toggle:hover:checked, .calendar .calendar-day.calendar-today:hover, .icon-button.default:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .default.screenshot-ui-show-pointer-button:hover, .message .message-header .default.message-expand-button:hover, + .message .message-header .default.message-close-button:hover, .calendar .calendar-month-header .default.pager-button:hover, .button.default:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; + color: -st-accent-fg-color; + background-color: st-mix(st-lighten(-st-accent-color, 4%), #ffffff, 87%); } - .keyboard-brightness-level .button:insensitive:checked, .quick-menu-toggle .quick-toggle-arrow:insensitive:checked, .quick-toggle:insensitive:checked, .calendar .calendar-day.calendar-today:insensitive, .icon-button.default:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .default.screenshot-ui-show-pointer-button:insensitive, .message .message-header .default.message-expand-button:insensitive, ++ .keyboard-brightness-level .button:insensitive:checked, .quick-toggle:insensitive:checked, .calendar .calendar-day.calendar-today:insensitive, .icon-button.default:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .default.screenshot-ui-show-pointer-button:insensitive, .message .message-header .default.message-expand-button:insensitive, + .message .message-header .default.message-close-button:insensitive, .calendar .calendar-month-header .default.pager-button:insensitive, .button.default:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; + color: st-transparentize(-st-accent-fg-color, 0.5); + background-color: st-darken(-st-accent-color, 3%); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } - .keyboard-brightness-level .button:active:checked, .quick-menu-toggle .quick-toggle-arrow:active:checked, .quick-toggle:active:checked, .calendar .calendar-day.calendar-today:active, .icon-button.default:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .default.screenshot-ui-show-pointer-button:active, .message .message-header .default.message-expand-button:active, ++ .keyboard-brightness-level .button:active:checked, .quick-toggle:active:checked, .calendar .calendar-day.calendar-today:active, .icon-button.default:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .default.screenshot-ui-show-pointer-button:active, .message .message-header .default.message-expand-button:active, + .message .message-header .default.message-close-button:active, .calendar .calendar-month-header .default.pager-button:active, .button.default:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; + color: -st-accent-fg-color; + background-color: st-mix(st-lighten(-st-accent-color, 9%), #ffffff, 87%); } - .keyboard-brightness-level .button:active:hover:checked, .quick-menu-toggle .quick-toggle-arrow:active:hover:checked, .quick-toggle:active:hover:checked, .calendar .calendar-day.calendar-today:active:hover, .icon-button.default:active:hover, .default.login-dialog-button.cancel-button:active:hover, .default.login-dialog-button.switch-user-button:active:hover, .default.login-dialog-button.login-dialog-session-list-button:active:hover, .default.screenshot-ui-show-pointer-button:active:hover, .message .message-header .default.message-expand-button:active:hover, ++ .keyboard-brightness-level .button:active:hover:checked, .quick-toggle:active:hover:checked, .calendar .calendar-day.calendar-today:active:hover, .icon-button.default:active:hover, .default.login-dialog-button.cancel-button:active:hover, .default.login-dialog-button.switch-user-button:active:hover, .default.login-dialog-button.login-dialog-session-list-button:active:hover, .default.screenshot-ui-show-pointer-button:active:hover, .message .message-header .default.message-expand-button:active:hover, + .message .message-header .default.message-close-button:active:hover, .calendar .calendar-month-header .default.pager-button:active:hover, .button.default:active:hover { + background-color: st-lighten(st-lighten(-st-accent-color, 9%), 4%); } - .keyboard-brightness-level .button:active:focus:checked, .quick-menu-toggle .quick-toggle-arrow:active:focus:checked, .quick-toggle:active:focus:checked, .calendar .calendar-day.calendar-today:active:focus, .icon-button.default:active:focus, .default.login-dialog-button.cancel-button:active:focus, .default.login-dialog-button.switch-user-button:active:focus, .default.login-dialog-button.login-dialog-session-list-button:active:focus, .default.screenshot-ui-show-pointer-button:active:focus, .message .message-header .default.message-expand-button:active:focus, ++ .keyboard-brightness-level .button:active:focus:checked, .quick-toggle:active:focus:checked, .calendar .calendar-day.calendar-today:active:focus, .icon-button.default:active:focus, .default.login-dialog-button.cancel-button:active:focus, .default.login-dialog-button.switch-user-button:active:focus, .default.login-dialog-button.login-dialog-session-list-button:active:focus, .default.screenshot-ui-show-pointer-button:active:focus, .message .message-header .default.message-expand-button:active:focus, + .message .message-header .default.message-close-button:active:focus, .calendar .calendar-month-header .default.pager-button:active:focus, .button.default:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(-st-accent-color, 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(-st-accent-color, 9%), #ffffff, 87%), 5%); } + +.popup-sub-menu .popup-menu-item, .popup-menu-item { + font-weight: normal; + spacing: 6px; + transition-duration: 100ms; + padding: 9px 12px; } + +#LookingGlassExtensions .lg-extension, #LookingGlassWindows .lg-window, .calendar, .datemenu-today-button, .quick-toggle-menu, .message, .events-button, +.world-clocks-button, +.weather-button { + border-radius: 12px; + padding: 0.818em; + margin: 4px; + background-color: #1a1a1a; + box-shadow: 0 1px 2px 0 transparent; + border: 1px solid #1a1a1a; + border-color: transparent; + box-shadow: none; } + +.quick-toggle-menu, .message, .events-button, +.world-clocks-button, +.weather-button { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(#1a1a1a, #ffffff, 87%); } + .quick-toggle-menu:hover, .message:hover, .events-button:hover, + .world-clocks-button:hover, + .weather-button:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#1a1a1a, 4%), #ffffff, 87%); } + .quick-toggle-menu:active, .message:active, .events-button:active, + .world-clocks-button:active, + .weather-button:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%); } + .quick-toggle-menu:active:hover, .message:active:hover, .events-button:active:hover, + .world-clocks-button:active:hover, + .weather-button:active:hover { + background-color: st-lighten(st-lighten(#1a1a1a, 9%), 4%); } + .quick-toggle-menu:active:focus, .message:active:focus, .events-button:active:focus, + .world-clocks-button:active:focus, + .weather-button:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%), 5%); } + .quick-toggle-menu:focus, .message:focus, .events-button:focus, + .world-clocks-button:focus, + .weather-button:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, st-mix(#1a1a1a, #ffffff, 87%), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#1a1a1a, #ffffff, 87%), 5%); } + .quick-toggle-menu:focus:hover, .message:focus:hover, .events-button:focus:hover, + .world-clocks-button:focus:hover, + .weather-button:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#1a1a1a, 4%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#1a1a1a, 4%), #ffffff, 87%), 5%); } + .quick-toggle-menu:insensitive, .message:insensitive, .events-button:insensitive, + .world-clocks-button:insensitive, + .weather-button:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: st-transparentize(#ffffff, 0.5); + background-color: st-darken(#1a1a1a, 3%); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + +.calendar, .datemenu-today-button { + border: 1px solid transparent !important; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + background-color: transparent; + border-color: transparent; + box-shadow: none; } + .calendar:insensitive, .datemenu-today-button:insensitive { + background-color: transparent !important; } + .calendar:hover, .datemenu-today-button:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#1a1a1a, 7%), #ffffff, 87%); } + .calendar:active, .datemenu-today-button:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%); } + .calendar:active:hover, .datemenu-today-button:active:hover { + background-color: st-lighten(st-lighten(#1a1a1a, 9%), 7%); } + .calendar:active:focus, .datemenu-today-button:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%), 5%); } + .calendar:focus, .datemenu-today-button:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, st-mix(#1a1a1a, #ffffff, 87%), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#1a1a1a, #ffffff, 87%), 5%); } + .calendar:focus:hover, .datemenu-today-button:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#1a1a1a, 4%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#1a1a1a, 4%), #ffffff, 87%), 5%); } + .calendar:insensitive, .datemenu-today-button:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: st-transparentize(#ffffff, 0.5); + background-color: st-darken(#1a1a1a, 3%); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + +.unlock-dialog .login-dialog-prompt-entry, .login-dialog .login-dialog-prompt-entry, .app-folder-dialog .folder-name-container .folder-name-entry, .search-entry, .lg-dialog StEntry, StEntry { + border-radius: 8px; + padding: 9px 9px; + selection-background-color: st-transparentize(-st-accent-color, 0.7); + selected-color: #ffffff; } + +StEntry { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + background-color: #2e2e2e; + color: rgba(255, 255, 255, 0.7); } + StEntry:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + background-color: #383838; + color: #ffffff; } + StEntry:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, #2e2e2e, 5%); ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #2e2e2e, 5%); + color: #ffffff; } + StEntry:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + background-color: #262626; + color: rgba(255, 255, 255, 0.5); } + StEntry StLabel.hint-text { + color: rgba(255, 255, 255, 0.7); } + +.notification-button, .message .message-header .message-expand-button, +.message .message-header .message-close-button { + font-weight: bold; + padding: 6px 12px; + border-radius: 8px; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(rgba(255, 255, 255, 0.15), #ffffff, 87%); } + .notification-button:focus, .message .message-header .message-expand-button:focus, + .message .message-header .message-close-button:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.15), #ffffff, 87%), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.15), #ffffff, 87%), 5%); } + .notification-button:focus:hover, .message .message-header .message-expand-button:focus:hover, + .message .message-header .message-close-button:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.3), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.3), #ffffff, 87%), 5%); } + .notification-button:hover, .message .message-header .message-expand-button:hover, + .message .message-header .message-close-button:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(rgba(255, 255, 255, 0.3), #ffffff, 87%); } + .notification-button:active, .message .message-header .message-expand-button:active, + .message .message-header .message-close-button:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(rgba(255, 255, 255, 0.2), #ffffff, 87%); } + .notification-button:active:hover, .message .message-header .message-expand-button:active:hover, + .message .message-header .message-close-button:active:hover { + background-color: rgba(255, 255, 255, 0.2); } + .notification-button:active:focus, .message .message-header .message-expand-button:active:focus, + .message .message-header .message-close-button:active:focus { - background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.2), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.2), #ffffff, 87%), 5%); } + .notification-button:checked, .message .message-header .message-expand-button:checked, + .message .message-header .message-close-button:checked { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), #ffffff, 87%); } + .notification-button:checked:hover, .message .message-header .message-expand-button:checked:hover, + .message .message-header .message-close-button:checked:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 4%); } + .notification-button:checked:active, .message .message-header .message-expand-button:checked:active, + .message .message-header .message-close-button:checked:active { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 9%); } + .notification-button:insensitive, .message .message-header .message-expand-button:insensitive, + .message .message-header .message-close-button:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: st-transparentize(#ffffff, 0.5); + background-color: rgba(255, 255, 255, 0.1); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + +.modal-dialog .modal-dialog-button-box .modal-dialog-button { + font-weight: bold; + padding: 12px; + border-radius: 12px; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(rgba(255, 255, 255, 0.1), #ffffff, 87%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.1), #ffffff, 87%), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.1), #ffffff, 87%), 5%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.13), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.13), #ffffff, 87%), 5%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(rgba(255, 255, 255, 0.13), #ffffff, 87%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(rgba(255, 255, 255, 0.16), #ffffff, 87%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:active:hover { + background-color: rgba(255, 255, 255, 0.19); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:active:focus { - background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.16), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.16), #ffffff, 87%), 5%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), #ffffff, 87%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 4%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked:active { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 9%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: st-transparentize(#ffffff, 0.5); + background-color: st-darken(st-mix(#ffffff, #1a1a1a, 9%), 3%); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + +.dash-label, .window-caption, .screenshot-ui-tooltip { + background-color: rgba(0, 0, 0, 0.9); + border: 1px solid rgba(255, 255, 255, 0.1); + color: #ffffff; + border-radius: 999px; + padding: 6px 12px; + text-align: center; + background-color: black; + border-color: rgba(255, 255, 255, 0.4); } + +/* General Typography */ +.unlock-dialog-clock .unlock-dialog-clock-date, .app-folder-dialog .folder-name-container .folder-name-label, .app-folder-dialog .folder-name-container .folder-name-entry, .search-statustext { + font-weight: 800; + font-size: 1.818em; } + - .conflicting-session-dialog-content .conflicting-session-dialog-title, .message-dialog-content .message-dialog-title, .message-list .message-list-placeholder, .datemenu-today-button .date-label { ++.conflicting-session-dialog-content .conflicting-session-dialog-title, .message-dialog-content .message-dialog-title, .datemenu-today-button .date-label { + font-weight: 800; + font-size: 1.364em; } + +.login-dialog .user-widget.horizontal .user-widget-label, - .unlock-dialog .user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title { ++.unlock-dialog .user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title, .message-list .message-list-placeholder { + font-weight: 700; + font-size: 1.364em; } + +.login-dialog-auth-list-label, #LookingGlassDebugFlags .lg-debug-flags-header, #LookingGlassExtensions .lg-extensions-none, .word-suggestions, .bt-menu-placeholder.popup-menu-item, .restart-message, .polkit-dialog-user-layout .polkit-dialog-user-label, +.polkit-dialog-user-layout .polkit-dialog-user-root-label, .message-dialog-content .message-dialog-title.lightweight { + font-weight: 700; + font-size: 1.182em; } + - .login-dialog-not-listed-label, #LookingGlassExtensions .lg-extension .lg-extension-name, #LookingGlassWindows .lg-window .lg-window-name, #LookingGlassPropertyInspector .lg-obj-inspector-title, .background-app-item .title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-box .weather-header-box .weather-header, .world-clocks-button .world-clocks-header, .events-button .events-box .events-list .event-box .event-summary, .events-button .events-box .events-title, .calendar .calendar-month-header .calendar-month-label { ++.login-dialog-not-listed-label, #LookingGlassExtensions .lg-extension .lg-extension-name, #LookingGlassWindows .lg-window .lg-window-name, #LookingGlassPropertyInspector .lg-obj-inspector-title, .background-app-item .title, .quick-toggle .quick-toggle-title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-box .weather-header-box .weather-header, .world-clocks-button .world-clocks-header, .events-button .events-box .events-list .event-box .event-summary, .events-button .events-box .events-title, .calendar .calendar-month-header .calendar-month-label { + font-weight: 700; + font-size: 1em; } + +.quick-toggle-menu .header .subtitle, .app-menu .popup-inactive-menu-item:first-child > StLabel { + font-weight: 700; + font-size: 0.818em; } + - .lg-completions-text, .caps-lock-warning-label, .background-app-item .subtitle, .quick-toggle StBoxLayout > .quick-toggle-subtitle, .screenshot-ui-type-button .icon-label-button-container, .prompt-dialog .prompt-dialog-error-label, ++.lg-completions-text, .caps-lock-warning-label, .background-app-item .subtitle, .quick-toggle .quick-toggle-subtitle, .screenshot-ui-type-button .icon-label-button-container, .prompt-dialog .prompt-dialog-error-label, +.prompt-dialog .prompt-dialog-info-label, +.prompt-dialog .prompt-dialog-null-label, .run-dialog .run-dialog-description, .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description, .message .message-header .message-header-content .event-time, .world-clocks-button .world-clocks-grid .world-clocks-timezone, .events-button .events-box .events-list .event-box .event-time { + font-weight: 400; + font-size: 0.818em; } + +.weather-button .weather-box .weather-grid .weather-forecast-time, .calendar .calendar-week-number, .calendar .calendar-day-heading, .calendar .calendar-day { + font-weight: 400; + font-size: 0.818em; } + +#LookingGlassDebugFlags .lg-debug-flag-button StLabel, #LookingGlassEvaluator .evaluator-results, .lg-dialog .actor-link { + font-family: monospace; } + +.unlock-dialog-clock .unlock-dialog-clock-time, #panel, .weather-button .weather-box .weather-grid .weather-forecast-temp, .world-clocks-button .world-clocks-grid .world-clocks-timezone, .world-clocks-button .world-clocks-grid .world-clocks-time, .events-button .events-box .events-list .event-box .event-time, .calendar .calendar-day-heading, .calendar .calendar-day { + font-feature-settings: "tnum"; } + +/* OSD Elements */ +#LookingGlassDialog, .screenshot-ui-panel, .workspace-switcher, .switcher-list, .resize-popup, .osd-window { + color: #ffffff; + background-color: #000000; + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 999px; + padding: 12px; + box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.4); + border: 2px solid rgba(255, 255, 255, 0.4); + box-shadow: none; } + +.lg-dialog StEntry { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + background-color: #171717; + color: rgba(255, 255, 255, 0.7); } + .lg-dialog StEntry:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + background-color: #212121; + color: #ffffff; } + .lg-dialog StEntry:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, #171717, 5%); ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #171717, 5%); + color: #ffffff; } + .lg-dialog StEntry:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + background-color: #0f0f0f; + color: rgba(255, 255, 255, 0.5); } + .lg-dialog StEntry StLabel.hint-text { + color: rgba(255, 255, 255, 0.7); } + +#LookingGlassDebugFlags .lg-debug-flag-button, #LookingGlassPropertyInspector .lg-obj-inspector-close-button, +#LookingGlassPropertyInspector .lg-obj-inspector-button, #LookingGlassDialog > #Toolbar .lg-toolbar-button { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%); } + #LookingGlassDebugFlags .lg-debug-flag-button:focus, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:focus, + #LookingGlassPropertyInspector .lg-obj-inspector-button:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%), 5%); } + #LookingGlassDebugFlags .lg-debug-flag-button:focus:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:focus:hover, + #LookingGlassPropertyInspector .lg-obj-inspector-button:focus:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%), 5%); } + #LookingGlassDebugFlags .lg-debug-flag-button:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:hover, + #LookingGlassPropertyInspector .lg-obj-inspector-button:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%); } + #LookingGlassDebugFlags .lg-debug-flag-button:active, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active, + #LookingGlassPropertyInspector .lg-obj-inspector-button:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%); } + #LookingGlassDebugFlags .lg-debug-flag-button:active:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active:hover, + #LookingGlassPropertyInspector .lg-obj-inspector-button:active:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), 4%); } + #LookingGlassDebugFlags .lg-debug-flag-button:active:focus, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active:focus, + #LookingGlassPropertyInspector .lg-obj-inspector-button:active:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); } + #LookingGlassDebugFlags .lg-debug-flag-button:checked, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked, + #LookingGlassPropertyInspector .lg-obj-inspector-button:checked, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 8%), #ffffff, 87%); } + #LookingGlassDebugFlags .lg-debug-flag-button:checked:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked:hover, + #LookingGlassPropertyInspector .lg-obj-inspector-button:checked:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 8%), 4%); } + #LookingGlassDebugFlags .lg-debug-flag-button:checked:active, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked:active, + #LookingGlassPropertyInspector .lg-obj-inspector-button:checked:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:active { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 8%), 9%); } + #LookingGlassDebugFlags .lg-debug-flag-button:insensitive, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:insensitive, + #LookingGlassPropertyInspector .lg-obj-inspector-button:insensitive, #LookingGlassDialog > #Toolbar .lg-toolbar-button:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: st-transparentize(#ffffff, 0.5); + background-color: st-darken(st-mix(#ffffff, #000000, 9%), 3%); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + +#LookingGlassDialog .notebook-tab, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: #000000; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + #LookingGlassDialog .notebook-tab:focus, .screenshot-ui-show-pointer-button:focus, .screenshot-ui-type-button:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, rgba(0, 0, 0, 0.25), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(0, 0, 0, 0.25), 5%); } + #LookingGlassDialog .notebook-tab:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .screenshot-ui-type-button:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); } + #LookingGlassDialog .notebook-tab:hover, .screenshot-ui-show-pointer-button:hover, .screenshot-ui-type-button:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#000000, 7%), #ffffff, 87%); } + #LookingGlassDialog .notebook-tab:active, .screenshot-ui-show-pointer-button:active, .screenshot-ui-type-button:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#000000, 9%), #ffffff, 87%); } + #LookingGlassDialog .notebook-tab:active:hover, .screenshot-ui-show-pointer-button:active:hover, .screenshot-ui-type-button:active:hover { + background-color: st-lighten(st-lighten(#000000, 9%), 7%); } + #LookingGlassDialog .notebook-tab:active:focus, .screenshot-ui-show-pointer-button:active:focus, .screenshot-ui-type-button:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); } + #LookingGlassDialog .notebook-tab:checked, .screenshot-ui-show-pointer-button:checked, .screenshot-ui-type-button:checked { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#000000, 8%), #ffffff, 87%); } + #LookingGlassDialog .notebook-tab:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .screenshot-ui-type-button:checked:hover { + background-color: st-lighten(st-lighten(#000000, 8%), 7%); } + #LookingGlassDialog .notebook-tab:checked:active, .screenshot-ui-show-pointer-button:checked:active, .screenshot-ui-type-button:checked:active { + background-color: st-lighten(st-lighten(#000000, 8%), 9%); } + #LookingGlassDialog .notebook-tab:insensitive, .screenshot-ui-show-pointer-button:insensitive, .screenshot-ui-type-button:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: st-transparentize(#ffffff, 0.5); + background-color: #000000; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + +/* System Elements */ +.login-dialog .login-dialog-prompt-entry, .app-folder-dialog .folder-name-container .folder-name-entry, .search-entry { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + background-color: #232323; + color: rgba(255, 255, 255, 0.7); } + .login-dialog .login-dialog-prompt-entry:hover, .app-folder-dialog .folder-name-container .folder-name-entry:hover, .search-entry:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + background-color: #2d2d2d; + color: #ffffff; } + .login-dialog .login-dialog-prompt-entry:focus, .app-folder-dialog .folder-name-container .folder-name-entry:focus, .search-entry:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, #232323, 5%); ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #232323, 5%); + color: #ffffff; } + .login-dialog .login-dialog-prompt-entry:insensitive, .app-folder-dialog .folder-name-container .folder-name-entry:insensitive, .search-entry:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + background-color: #1b1b1b; + color: rgba(255, 255, 255, 0.5); } + .login-dialog .login-dialog-prompt-entry StLabel.hint-text, .app-folder-dialog .folder-name-container .folder-name-entry StLabel.hint-text, .search-entry StLabel.hint-text { + color: rgba(255, 255, 255, 0.7); } + +.login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-mix(#ffffff, #0d0d0d, 9%), #ffffff, 87%); } + .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: st-transparentize(#ffffff, 0.5); + background-color: st-darken(st-mix(#ffffff, #0d0d0d, 9%), 3%); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #0d0d0d, 9%), #ffffff, 87%), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #0d0d0d, 9%), #ffffff, 87%), 5%); } + .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 4%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 4%), #ffffff, 87%), 5%); } + .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 4%), #ffffff, 87%); } + .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 9%), #ffffff, 87%); } + .login-dialog-button.cancel-button:active:hover, .login-dialog-button.switch-user-button:active:hover, .login-dialog-button.login-dialog-session-list-button:active:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 9%), 4%); } + .login-dialog-button.cancel-button:active:focus, .login-dialog-button.switch-user-button:active:focus, .login-dialog-button.login-dialog-session-list-button:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 9%), #ffffff, 87%), 5%); } + .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 8%), #ffffff, 87%); } + .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 8%), 4%); } + .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 8%), 9%); } + +/* Lockscreen Elements */ +.unlock-dialog .button, +.unlock-dialog .icon-button, +.unlock-dialog .calendar .calendar-month-header .pager-button, +.calendar .calendar-month-header .unlock-dialog .pager-button, +.unlock-dialog .message .message-header .message-expand-button, +.message .message-header .unlock-dialog .message-expand-button, +.unlock-dialog .message .message-header .message-close-button, +.message .message-header .unlock-dialog .message-close-button, +.unlock-dialog .screenshot-ui-show-pointer-button, +.unlock-dialog .login-dialog-button.cancel-button, +.unlock-dialog .login-dialog-button.switch-user-button, +.unlock-dialog .login-dialog-button.login-dialog-session-list-button { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(rgba(255, 255, 255, 0.1), #ffffff, 87%); } + .unlock-dialog .button:focus, + .unlock-dialog .icon-button:focus, + .unlock-dialog .calendar .calendar-month-header .pager-button:focus, + .calendar .calendar-month-header .unlock-dialog .pager-button:focus, + .unlock-dialog .message .message-header .message-expand-button:focus, + .message .message-header .unlock-dialog .message-expand-button:focus, + .unlock-dialog .message .message-header .message-close-button:focus, + .message .message-header .unlock-dialog .message-close-button:focus, + .unlock-dialog .screenshot-ui-show-pointer-button:focus, + .unlock-dialog .login-dialog-button.cancel-button:focus, + .unlock-dialog .login-dialog-button.switch-user-button:focus, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.1), #ffffff, 87%), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.1), #ffffff, 87%), 5%); } + .unlock-dialog .button:focus:hover, + .unlock-dialog .icon-button:focus:hover, + .unlock-dialog .calendar .calendar-month-header .pager-button:focus:hover, + .calendar .calendar-month-header .unlock-dialog .pager-button:focus:hover, + .unlock-dialog .message .message-header .message-expand-button:focus:hover, + .message .message-header .unlock-dialog .message-expand-button:focus:hover, + .unlock-dialog .message .message-header .message-close-button:focus:hover, + .message .message-header .unlock-dialog .message-close-button:focus:hover, + .unlock-dialog .screenshot-ui-show-pointer-button:focus:hover, + .unlock-dialog .login-dialog-button.cancel-button:focus:hover, + .unlock-dialog .login-dialog-button.switch-user-button:focus:hover, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.13), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.13), #ffffff, 87%), 5%); } + .unlock-dialog .button:hover, + .unlock-dialog .icon-button:hover, + .unlock-dialog .calendar .calendar-month-header .pager-button:hover, + .calendar .calendar-month-header .unlock-dialog .pager-button:hover, + .unlock-dialog .message .message-header .message-expand-button:hover, + .message .message-header .unlock-dialog .message-expand-button:hover, + .unlock-dialog .message .message-header .message-close-button:hover, + .message .message-header .unlock-dialog .message-close-button:hover, + .unlock-dialog .screenshot-ui-show-pointer-button:hover, + .unlock-dialog .login-dialog-button.cancel-button:hover, + .unlock-dialog .login-dialog-button.switch-user-button:hover, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(rgba(255, 255, 255, 0.13), #ffffff, 87%); } + .unlock-dialog .button:active, + .unlock-dialog .icon-button:active, + .unlock-dialog .calendar .calendar-month-header .pager-button:active, + .calendar .calendar-month-header .unlock-dialog .pager-button:active, + .unlock-dialog .message .message-header .message-expand-button:active, + .message .message-header .unlock-dialog .message-expand-button:active, + .unlock-dialog .message .message-header .message-close-button:active, + .message .message-header .unlock-dialog .message-close-button:active, + .unlock-dialog .screenshot-ui-show-pointer-button:active, + .unlock-dialog .login-dialog-button.cancel-button:active, + .unlock-dialog .login-dialog-button.switch-user-button:active, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(rgba(255, 255, 255, 0.16), #ffffff, 87%); } + .unlock-dialog .button:active:hover, + .unlock-dialog .icon-button:active:hover, + .unlock-dialog .calendar .calendar-month-header .pager-button:active:hover, + .calendar .calendar-month-header .unlock-dialog .pager-button:active:hover, + .unlock-dialog .message .message-header .message-expand-button:active:hover, + .message .message-header .unlock-dialog .message-expand-button:active:hover, + .unlock-dialog .message .message-header .message-close-button:active:hover, + .message .message-header .unlock-dialog .message-close-button:active:hover, + .unlock-dialog .screenshot-ui-show-pointer-button:active:hover, + .unlock-dialog .login-dialog-button.cancel-button:active:hover, + .unlock-dialog .login-dialog-button.switch-user-button:active:hover, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active:hover { + background-color: rgba(255, 255, 255, 0.19); } + .unlock-dialog .button:active:focus, + .unlock-dialog .icon-button:active:focus, + .unlock-dialog .calendar .calendar-month-header .pager-button:active:focus, + .calendar .calendar-month-header .unlock-dialog .pager-button:active:focus, + .unlock-dialog .message .message-header .message-expand-button:active:focus, + .message .message-header .unlock-dialog .message-expand-button:active:focus, + .unlock-dialog .message .message-header .message-close-button:active:focus, + .message .message-header .unlock-dialog .message-close-button:active:focus, + .unlock-dialog .screenshot-ui-show-pointer-button:active:focus, + .unlock-dialog .login-dialog-button.cancel-button:active:focus, + .unlock-dialog .login-dialog-button.switch-user-button:active:focus, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active:focus { - background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.16), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.16), #ffffff, 87%), 5%); } + .unlock-dialog .button:checked, + .unlock-dialog .icon-button:checked, + .unlock-dialog .calendar .calendar-month-header .pager-button:checked, + .calendar .calendar-month-header .unlock-dialog .pager-button:checked, + .unlock-dialog .message .message-header .message-expand-button:checked, + .message .message-header .unlock-dialog .message-expand-button:checked, + .unlock-dialog .message .message-header .message-close-button:checked, + .message .message-header .unlock-dialog .message-close-button:checked, + .unlock-dialog .screenshot-ui-show-pointer-button:checked, + .unlock-dialog .login-dialog-button.cancel-button:checked, + .unlock-dialog .login-dialog-button.switch-user-button:checked, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), #ffffff, 87%); } + .unlock-dialog .button:checked:hover, + .unlock-dialog .icon-button:checked:hover, + .unlock-dialog .calendar .calendar-month-header .pager-button:checked:hover, + .calendar .calendar-month-header .unlock-dialog .pager-button:checked:hover, + .unlock-dialog .message .message-header .message-expand-button:checked:hover, + .message .message-header .unlock-dialog .message-expand-button:checked:hover, + .unlock-dialog .message .message-header .message-close-button:checked:hover, + .message .message-header .unlock-dialog .message-close-button:checked:hover, + .unlock-dialog .screenshot-ui-show-pointer-button:checked:hover, + .unlock-dialog .login-dialog-button.cancel-button:checked:hover, + .unlock-dialog .login-dialog-button.switch-user-button:checked:hover, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 4%); } + .unlock-dialog .button:checked:active, + .unlock-dialog .icon-button:checked:active, + .unlock-dialog .calendar .calendar-month-header .pager-button:checked:active, + .calendar .calendar-month-header .unlock-dialog .pager-button:checked:active, + .unlock-dialog .message .message-header .message-expand-button:checked:active, + .message .message-header .unlock-dialog .message-expand-button:checked:active, + .unlock-dialog .message .message-header .message-close-button:checked:active, + .message .message-header .unlock-dialog .message-close-button:checked:active, + .unlock-dialog .screenshot-ui-show-pointer-button:checked:active, + .unlock-dialog .login-dialog-button.cancel-button:checked:active, + .unlock-dialog .login-dialog-button.switch-user-button:checked:active, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked:active { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 9%); } + .unlock-dialog .button:insensitive, + .unlock-dialog .icon-button:insensitive, + .unlock-dialog .calendar .calendar-month-header .pager-button:insensitive, + .calendar .calendar-month-header .unlock-dialog .pager-button:insensitive, + .unlock-dialog .message .message-header .message-expand-button:insensitive, + .message .message-header .unlock-dialog .message-expand-button:insensitive, + .unlock-dialog .message .message-header .message-close-button:insensitive, + .message .message-header .unlock-dialog .message-close-button:insensitive, + .unlock-dialog .screenshot-ui-show-pointer-button:insensitive, + .unlock-dialog .login-dialog-button.cancel-button:insensitive, + .unlock-dialog .login-dialog-button.switch-user-button:insensitive, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: st-transparentize(#ffffff, 0.5); + background-color: st-darken(st-mix(#ffffff, #1a1a1a, 9%), 3%); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + +.unlock-dialog .login-dialog-prompt-entry { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + background-color: rgba(255, 255, 255, 0.1); + color: rgba(255, 255, 255, 0.7); } + .unlock-dialog .login-dialog-prompt-entry:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + background-color: rgba(255, 255, 255, 0.1); + color: #ffffff; } + .unlock-dialog .login-dialog-prompt-entry:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.1), 5%); ++ box-shadow: inset 0 0 0 2px st-transparentize(rgba(255, 255, 255, 0.7), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.1), 5%); + color: #ffffff; - box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.7) !important; ++ box-shadow: inset 0 0 0 2px st-transparentize(rgba(255, 255, 255, 0.7), 0.1) !important; + background-color: st-mix(rgba(255, 255, 255, 0.7), rgba(255, 255, 255, 0.1), 5%); } + .unlock-dialog .login-dialog-prompt-entry:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + background-color: rgba(247, 247, 247, 0.1); + color: rgba(255, 255, 255, 0.5); } + .unlock-dialog .login-dialog-prompt-entry StLabel.hint-text { + color: rgba(255, 255, 255, 0.7); } + +/* WIDGETS */ +.shell-link { + color: st-lighten(-st-accent-color, 20%); } + .shell-link:hover { + color: st-lighten(st-lighten(-st-accent-color, 20%), 10%); } + +.lowres-icon { + icon-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } + +.icon-dropshadow { + icon-shadow: 0 2px 4px rgba(0, 0, 0, 0.4); + icon-shadow: none; } + +/* Entries */ +StEntry StIcon.capslock-warning { + icon-size: 1.091em; - warning-color: #f6d32d; ++ warning-color: #cd9309; + padding: 0 4px; } + +StEntry StIcon.peek-password { + icon-size: 1.091em; + padding: 0 4px; } + +StEntry StLabel.hint-text { + margin-left: 2px; } + +/* Buttons */ +.button { + min-height: 1.5em; } + +.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .screenshot-ui-show-pointer-button, .message .message-header .message-expand-button, +.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button { + border-radius: 999px; + padding: 0.818em; + min-height: 1.091em; } + .icon-button StIcon, .login-dialog-button.cancel-button StIcon, .login-dialog-button.switch-user-button StIcon, .login-dialog-button.login-dialog-session-list-button StIcon, .screenshot-ui-show-pointer-button StIcon, .message .message-header .message-expand-button StIcon, + .message .message-header .message-close-button StIcon, .calendar .calendar-month-header .pager-button StIcon { + icon-size: 1.091em; + -st-icon-style: symbolic; } + +/* Check Boxes */ +.check-box StBoxLayout { + spacing: .8em; } + +.check-box StBin { + border-radius: 7px; + padding: 2px; } + +.check-box:focus StBin { + background-color: rgba(0, 0, 0, 0.01); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.65); } + +.check-box StIcon { + icon-size: 14px; + padding: 1px; + color: transparent; + border-radius: 6px; + border: 2px solid rgba(255, 255, 255, 0.15); } + +.check-box:hover StIcon { + border-color: rgba(255, 255, 255, 0.2); } + +.check-box:active StIcon { + border-color: rgba(255, 255, 255, 0.3); } + +.check-box:checked StIcon { + background-color: -st-accent-color; + color: -st-accent-fg-color; + border-color: transparent; } + +.check-box:checked:hover StIcon { + background-color: st-lighten(-st-accent-color, 5%); + color: st-lighten(-st-accent-fg-color, 5%); } + +.check-box:checked:active StIcon { + background-color: st-darken(-st-accent-color, 7%); + color: st-darken(-st-accent-fg-color, 7%); } + +/* Switches */ +.toggle-switch { + width: 46px; + border-radius: 999px; + transition-duration: 100ms; + color: #ffffff; + background: rgba(255, 255, 255, 0.3); } + .toggle-switch:hover { + background: rgba(255, 255, 255, 0.4); } + .toggle-switch StIcon { + icon-size: 16px; } + .toggle-switch .handle { + margin: 3px; + width: 20px; + height: 20px; + border-radius: 999px; + background: #d1d1d1; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + transition-duration: 100ms; } + .toggle-switch:checked { + background: -st-accent-color; + color: -st-accent-fg-color; } + .toggle-switch:checked:hover { + background-color: st-lighten(-st-accent-color, 5%); + color: st-lighten(-st-accent-fg-color, 5%); } + .toggle-switch:checked .handle { + background: white; } + +/* Slider */ +.slider { + color: #e8e8e8; + -barlevel-height: 4px; + -barlevel-background-color: rgba(255, 255, 255, 0.1); + -barlevel-active-background-color: -st-accent-color; + -barlevel-overdrive-color: #c01c28; + -barlevel-overdrive-separator-width: 1px; + -slider-handle-radius: 0.5455em; + -barlevel-background-color: rgba(255, 255, 255, 0.4); } + .slider:hover { + color: #ffffff; } + +/* Scrollbars */ +StScrollView.vfade { + -st-vfade-offset: 68px; } + +StScrollView.hfade { + -st-hfade-offset: 68px; } + +StScrollBar { + padding: 0; } + StScrollView StScrollBar { + min-width: 8px; + min-height: 8px; } + StScrollBar StBin#trough { + border-radius: 0; + background-color: transparent; } + StScrollBar StButton#vhandle, StScrollBar StButton#hhandle { + border-radius: 8px; + background-color: #5e5e5e; + border: 3px solid transparent; + transition: 500ms all ease; } + StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover { + background-color: #8c8c8c; } + StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active { + background-color: #757575; } + +/* Popovers/Menus */ +.popup-menu-boxpointer, .candidate-popup-boxpointer { + -arrow-rise: 6px; } + +.popup-menu { + min-width: 15em; + color: #ffffff; } + .popup-menu.panel-menu { + margin-bottom: 1.75em; } + +.popup-menu-content, .candidate-popup-content { + padding: 6px; + background-color: #1a1a1a; + border-radius: 20px; + border: 1px solid rgba(255, 255, 255, 0.5); + box-shadow: 0 2px 4px 0 transparent; } + +.popup-menu-item { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + background-color: transparent; + border-color: transparent; + box-shadow: none; + border-radius: 12px; } + .popup-menu-item:insensitive { + background-color: transparent !important; } - .popup-menu-item:hover { - box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); - color: #ffffff; - background-color: st-mix(st-lighten(st-mix(#ffffff, #262626, 9%), 4%), #ffffff, 87%); } + .popup-menu-item:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - background-color: st-mix(st-lighten(st-mix(#ffffff, #262626, 9%), 9%), #ffffff, 87%); } ++ background-color: st-mix(st-lighten(#262626, 9%), #ffffff, 87%); } + .popup-menu-item:active:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #262626, 9%), 9%), 4%); } ++ background-color: st-lighten(st-lighten(#262626, 9%), 7%); } + .popup-menu-item:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #262626, 9%), 9%), #ffffff, 87%), 5%); } - .popup-menu-item:selected, .popup-menu-item:checked { ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#262626, 9%), #ffffff, 87%), 5%); } ++ .popup-menu-item:hover, .popup-menu-item:selected, .popup-menu-item:checked { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - background-color: st-mix(st-lighten(st-mix(#ffffff, #262626, 9%), 8%), #ffffff, 87%); } - .popup-menu-item:selected:hover, .popup-menu-item:checked:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #262626, 9%), 8%), 4%); } - .popup-menu-item:selected:active, .popup-menu-item:checked:active { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #262626, 9%), 8%), 9%); } ++ background-color: st-mix(st-lighten(#262626, 7%), #ffffff, 87%); } + .popup-menu-item:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: st-transparentize(#ffffff, 0.5); - background-color: st-darken(st-mix(#ffffff, #262626, 9%), 3%); ++ background-color: #262626; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + .popup-menu-item:checked { + border-radius: 12px 12px 0 0 !important; + border: 1px solid rgba(255, 255, 255, 0.4); + border-bottom-width: 0; } + .popup-menu-item .toggle-switch:ltr { + margin-left: 4px; } + .popup-menu-item .toggle-switch:rtl { + margin-right: 4px; } + +.popup-ornamented-menu-item:ltr { + padding-left: 6px; } + +.popup-ornamented-menu-item:rtl { + padding-right: 6px; } + +.popup-inactive-menu-item { + color: #ffffff; } + .popup-inactive-menu-item:insensitive { + color: #ffffff; } + +.popup-menu-arrow, +.popup-menu-icon { + icon-size: 1.091em; } + +.popup-sub-menu { + border-radius: 0 0 13px 13px; + margin-bottom: 6px; + border: 1px solid transparent; + background-color: #3b3b3b; + border-color: rgba(255, 255, 255, 0.4); } + .popup-sub-menu .popup-menu-item { + border-radius: 0; + border-top-width: 0; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + background-color: transparent; + border-color: transparent; + box-shadow: none; } + .popup-sub-menu .popup-menu-item:insensitive { + background-color: transparent !important; } - .popup-sub-menu .popup-menu-item:hover { - box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); - color: #ffffff; - background-color: st-mix(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 4%), #ffffff, 87%); } + .popup-sub-menu .popup-menu-item:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - background-color: st-mix(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 9%), #ffffff, 87%); } ++ background-color: st-mix(st-lighten(#3b3b3b, 9%), #ffffff, 87%); } + .popup-sub-menu .popup-menu-item:active:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 9%), 4%); } ++ background-color: st-lighten(st-lighten(#3b3b3b, 9%), 7%); } + .popup-sub-menu .popup-menu-item:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 9%), #ffffff, 87%), 5%); } - .popup-sub-menu .popup-menu-item:selected, .popup-sub-menu .popup-menu-item:checked { ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#3b3b3b, 9%), #ffffff, 87%), 5%); } ++ .popup-sub-menu .popup-menu-item:hover, .popup-sub-menu .popup-menu-item:selected, .popup-sub-menu .popup-menu-item:checked { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - background-color: st-mix(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 8%), #ffffff, 87%); } - .popup-sub-menu .popup-menu-item:selected:hover, .popup-sub-menu .popup-menu-item:checked:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 8%), 4%); } - .popup-sub-menu .popup-menu-item:selected:active, .popup-sub-menu .popup-menu-item:checked:active { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 8%), 9%); } ++ background-color: st-mix(st-lighten(#3b3b3b, 7%), #ffffff, 87%); } + .popup-sub-menu .popup-menu-item:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: st-transparentize(#ffffff, 0.5); - background-color: st-darken(st-mix(#ffffff, #3b3b3b, 9%), 3%); ++ background-color: #3b3b3b; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + .popup-sub-menu .popup-menu-item:last-child { + border-radius: 0 0 12px 12px; + border-bottom-width: 0; } + .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:hover, .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:focus { + border-radius: 0; } + .popup-sub-menu .popup-menu-section:last-child .popup-menu-item:last-child { + border-radius: 0 0 12px 12px; } + +.popup-menu-ornament { + icon-size: 1.091em !important; + width: 1.091em; } + +.popup-separator-menu-item { + border: none !important; } + .popup-separator-menu-item .popup-separator-menu-item-separator { + height: 1px; + background-color: rgba(255, 255, 255, 0.5); } + .popup-sub-menu .popup-separator-menu-item { + background-color: transparent; } + .popup-sub-menu .popup-separator-menu-item:ltr { + margin-right: 2.5em; } + .popup-sub-menu .popup-separator-menu-item:rtl { + margin-left: 2.5em; } + .popup-sub-menu .popup-separator-menu-item .popup-separator-menu-item-separator { + background-color: rgba(255, 255, 255, 0.5); } + +.background-menu { + -boxpointer-gap: 0px; + -arrow-rise: 0px; } + +.app-menu { + max-width: 27.25em; } + .app-menu .popup-inactive-menu-item:first-child > StLabel:ltr { + margin-right: 8px; } + .app-menu .popup-inactive-menu-item:first-child > StLabel:rtl { + margin-left: 8px; } + +/* Date/Time Menu */ +#calendarArea { + padding: 4px; } + +.datemenu-popover { + border-radius: 30px; } + +.datemenu-calendar-column { + spacing: 6px; } + .datemenu-calendar-column:ltr { + margin-left: 6px; } + .datemenu-calendar-column:rtl { + margin-right: 6px; } + .datemenu-calendar-column .datemenu-displays-box { + spacing: 6px; } + +.datemenu-today-button { + padding: 9px; } + .datemenu-today-button .day-label { + font-weight: bold; } + +.calendar { + margin-top: 0; + padding: 0; } + .calendar .calendar-month-header .calendar-change-month-back StIcon, + .calendar .calendar-month-header .calendar-change-month-forward StIcon { + icon-size: 1.091em; } + .calendar .calendar-month-header .calendar-month-label { + color: #ffffff !important; + padding: 8px 0; + width: 10em; + border-radius: 999px; + text-align: center; } + .calendar .calendar-month-header .pager-button { + height: 2.6em; + width: 2.6em; + padding: 0; } + .calendar .calendar-day { + border-radius: 999px; + height: 3em; + width: 3em; + margin: 2px; + padding: 0; + font-weight: bold; + text-align: center; } + .calendar .calendar-day.calendar-weekend { + color: #ffffff; + font-style: italic; } + .calendar .calendar-day.calendar-other-month { + color: rgba(255, 255, 255, 0.5); + font-weight: normal; + color: #ffffff; + font-style: italic; } + .calendar .calendar-day.calendar-other-month.calendar-weekend { + color: rgba(255, 255, 255, 0.5); + color: #ffffff; } + .calendar .calendar-day.calendar-today { + color: -st-accent-fg-color !important; } + .calendar .calendar-day.calendar-today.calendar-day-with-events { + background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg") !important; } + .calendar .calendar-day.calendar-day-with-events { + background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg"); + background-size: contain; } + .calendar .calendar-day-heading { + font-weight: bold; + text-align: center; + margin: 4px; + padding: 3px 6px; + border-radius: 8px; } + .calendar .calendar-week-number { + font-weight: bold; + font-feature-settings: "tnum"; + text-align: center; + margin: 6px; + padding: 0 6px; + border-radius: 4px; + background-color: rgba(255, 255, 255, 0.2); + color: #ffffff; } + +.events-button .events-box .events-title { + color: #ffffff; + padding-bottom: 6px; } + +.events-button .events-box .events-list { + spacing: 6px; } + .events-button .events-box .events-list .event-box { + spacing: 6px; + border-radius: 8px; } + .events-button .events-box .events-list .event-box .event-time { + color: #ffffff; } + .events-button .events-box .events-list .event-placeholder { + color: #ffffff; + font-style: italic; } + +.world-clocks-button .world-clocks-header { + color: #ffffff; } + .world-clocks-button .world-clocks-header.no-world-clocks { + color: #ffffff; } + +.world-clocks-button .world-clocks-grid { + spacing-rows: 6px; + spacing-columns: 12px; } + .world-clocks-button .world-clocks-grid .world-clocks-time { + font-weight: bold; } + .world-clocks-button .world-clocks-grid .world-clocks-time:ltr { + text-align: right; } + .world-clocks-button .world-clocks-grid .world-clocks-time:rtl { + text-align: left; } + .world-clocks-button .world-clocks-grid .world-clocks-timezone { + color: #ffffff; } + +.weather-button .weather-box { + spacing: 6px; } + .weather-button .weather-box .weather-header-box { + spacing: 6px; } + .weather-button .weather-box .weather-header-box .weather-header { + color: #ffffff; } + .weather-button .weather-box .weather-header-box .weather-header.no-location { + color: #ffffff; } + .weather-button .weather-box .weather-header-box .weather-header.location { + font-weight: normal; } + .weather-button .weather-box .weather-grid { + spacing-rows: 6px; + spacing-columns: 12px; } + .weather-button .weather-box .weather-grid .weather-forecast-time { + padding-top: 6px; + padding-bottom: 6px; } + .weather-button .weather-box .weather-grid .weather-forecast-icon { + icon-size: 2.182em; + margin-bottom: 4px; } + .weather-button .weather-box .weather-grid .weather-forecast-temp { + font-weight: bold; } + +/* Message List */ +.message-list { + width: 29em; + border: solid rgba(255, 255, 255, 0.5); } + .message-list:ltr { + margin-left: 0; + margin-right: 4px; + padding-right: 6px; + border-right-width: 1px; } + .message-list:rtl { + margin-right: 0; + margin-left: 4px; + padding-left: 6px; + border-left-width: 1px; } + .message-list .message-list-placeholder { - color: rgba(255, 255, 255, 0.25); - color: rgba(255, 255, 255, 0.5); } ++ color: rgba(255, 255, 255, 0.45); ++ color: #ffffff; } + .message-list .message-list-placeholder > StIcon { + icon-size: 96px; + margin-bottom: 12px; + -st-icon-style: symbolic; } + +.message-list-sections { + spacing: 12px; } + .message-list-sections:ltr { + margin-right: 12px; } + .message-list-sections:rtl { + margin-left: 12px; } + +.message-list-section, +.message-list-section-list { + spacing: 12px; } + +.message-list-controls { + padding: 12px; + padding-bottom: 6px; + spacing: 6px; } + .message-list-controls .dnd-button { + border-width: 2px; + border-color: transparent; + border-radius: 32px; + border-style: solid; } + .message-list-controls .dnd-button:focus { + border-color: st-transparentize(-st-accent-color, 0.4); } + +.message { + padding: 6px; + margin: 0; + border-radius: 16px; } + .message .message-header { + spacing: 6px; + color: #ffffff; + padding: 0 6px; } + .message .message-header:ltr { + padding-right: 0; } + .message .message-header:rtl { + padding-left: 0; } + .message .message-header .message-source-icon { + icon-size: 1.091em; + -st-icon-style: symbolic; } + .message .message-header .message-header-content { + spacing: 6px; + min-height: 1.637em; + padding-bottom: 6px; } + .message .message-header .message-header-content .message-source-title { + font-weight: bold; } + .message .message-header .message-header-content .event-time { + color: #ffffff; + padding-bottom: 0.068em; } + .message .message-header .message-header-content .event-time:ltr { + text-align: right; } + .message .message-header .message-header-content .event-time:rtl { + text-align: left; } + .message .message-header .message-expand-button, + .message .message-header .message-close-button { + border-radius: 999px; + color: #ffffff; } + .message .message-header .message-expand-button { + padding: 6px; } + .message .message-header .message-close-button { + margin: 3px; + padding: 4px; } + .message .message-box { + padding: 6px; + margin-top: 0; + spacing: 6px; } + .message .message-box .message-icon { + icon-size: 48px; } + .message .message-box .message-icon:ltr { + margin-right: 6px; } + .message .message-box .message-icon:rtl { + margin-left: 6px; } + .message .message-box .message-icon.message-themed-icon { + border-radius: 999px; + background-color: rgba(255, 255, 255, 0.07); + icon-size: 1.091em; + min-width: 48px; + min-height: 48px; } + .message .message-box:first-child { + margin-top: 12px; } + .message .message-box .message-content { + spacing: 4px; } + .message .message-box .message-content .message-title { + font-weight: bold; } + .message .message-action-bin { + padding: 4px; + spacing: 6px; } + .message .message-action-bin * { + margin: 0 4px; } + .message .message-action-bin *:first-child:ltr { + margin-left: 0; } + .message .message-action-bin *:first-child:rtl { + margin-right: 0; } + .message .message-action-bin *:last-child:ltr { + margin-right: 0; } + .message .message-action-bin *:last-child:rtl { + margin-left: 0; } + +.url-highlighter { + link-color: st-lighten(-st-accent-color, 20%); } + +/* Media Controls */ +.message-media-control { + padding: 0 18px; + border-radius: 8px; + color: #ffffff; + border: 1px solid transparent; + border-color: rgba(255, 255, 255, 0.4); + margin: 12px 2px; } + .message-media-control:hover { + background-color: #595959; + color: #ffffff; } + .message-media-control:active { + background-color: #5e5e5e; + color: #ffffff; } + .message-media-control:insensitive { + color: white; + border-color: transparent; } + .message-media-control StIcon { + icon-size: 16px; } + +.media-message .message-icon { + border-radius: 8px !important; } + .media-message .message-icon.message-themed-icon { + icon-size: 32px !important; } + +.candidate-popup-content { + padding: 6px; + spacing: 6px; + border-radius: 12px; } + +.candidate-index { + padding: 0; + padding-right: 6px; + color: #ffffff; } + +.candidate-box { + padding: 6px 12px 6px 12px; + border-radius: 8px; } + .candidate-box:selected { + background-color: -st-accent-color; + color: -st-accent-fg-color; } + .candidate-box:hover { + background-color: #4d4d4d; + color: white; } + +.candidate-page-button-box { + height: 2em; } + .vertical .candidate-page-button-box { + padding-top: 12px; } + .horizontal .candidate-page-button-box { + padding-left: 12px; } + +.candidate-page-button { + padding: 6px; } + .candidate-page-button StIcon { + icon-size: 16px; } + +.candidate-page-button-previous { + border-radius: 8px 0px 0px 8px; + border-right-width: 0; + box-shadow: none; } + +.candidate-page-button-next { + border-radius: 0px 8px 8px 0px; + box-shadow: none; } + +/* Notifications & Message Tray */ +.notification-banner { + min-height: 64px; + width: 34em; + box-shadow: 0 2px 4px 2px transparent; + border-radius: 16px; + margin: 4px; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); } + +.notification-buttons-bin { + spacing: 0; } + +/* Modal Dialogs */ +.modal-dialog { + background-color: #1a1a1a; + border-radius: 18px; + padding: 24px; + spacing: 18px; + box-shadow: 0 12px 8px 12px rgba(0, 0, 0, 0.03); } + .modal-dialog .modal-dialog-content-box { + padding-top: 12px; + spacing: 18px; + max-width: 28em; } + .modal-dialog .modal-dialog-button-box { + padding-top: 6px; } + +.dialog-list { + spacing: 18px; } + .dialog-list .dialog-list-title { + text-align: center; } + .dialog-list .dialog-list-scrollview { + max-height: 200px; } + .dialog-list .dialog-list-box { + spacing: 1em; } + .dialog-list .dialog-list-box .dialog-list-item { + spacing: 1em; } + .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-title { + font-weight: bold; } + .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description { + color: #f2f2f2; } + +/* End Session Dialog */ +.end-session-dialog { + width: 24em; } + .end-session-dialog .end-session-dialog-battery-warning, + .end-session-dialog .dialog-list-title { - color: #f6d32d; - background-color: rgba(246, 211, 45, 0.1); ++ color: #cd9309; ++ background-color: rgba(205, 147, 9, 0.1); + padding: 9px; + border-radius: 8px; + margin: 4px 0; } + +/* Message Dialog */ +.message-dialog-content { + spacing: 18px; } + .message-dialog-content .message-dialog-title { + text-align: center; } + .message-dialog-content .message-dialog-description { + text-align: center; } + +/* Run Dialog */ +.run-dialog { + width: 24em; + padding-bottom: 6px; } + .run-dialog .run-dialog-entry { + padding: 12px 9px; } + .run-dialog .run-dialog-description { + color: #cccccc; } + +/* Password or Authentication Dialog */ +.prompt-dialog { + width: 28em; } + .prompt-dialog .prompt-dialog-password-grid { + spacing-rows: 8px; + spacing-columns: 4px; } + .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry { + width: auto; } + .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry:ltr { + margin-left: 20px; } + .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry:rtl { + margin-right: 20px; } + .prompt-dialog .prompt-dialog-password-layout { + spacing: 8px; } + .prompt-dialog .prompt-dialog-password-entry { + width: 20em; + padding: 12px 9px; } + .prompt-dialog .prompt-dialog-error-label, + .prompt-dialog .prompt-dialog-info-label, + .prompt-dialog .prompt-dialog-null-label { + text-align: center; } + .prompt-dialog .prompt-dialog-error-label { - color: #f6d32d; } ++ color: #cd9309; } + +/* Polkit Dialog */ +.polkit-dialog-user-layout { + text-align: center; + spacing: 8px; + margin-bottom: 6px; } + .polkit-dialog-user-layout .polkit-dialog-user-root-label { - color: #f6d32d; } ++ color: #cd9309; } + +/* Audio selection dialog */ +.audio-device-selection-dialog { + min-width: 24em; } + .audio-device-selection-dialog .audio-selection-box { + spacing: 12px; } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: #000000; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; - border: none; } ++ border: none; ++ background-color: transparent; } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, rgba(0, 0, 0, 0.25), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(0, 0, 0, 0.25), 5%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#000000, 7%), #ffffff, 87%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#000000, 9%), #ffffff, 87%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active:hover { + background-color: st-lighten(st-lighten(#000000, 9%), 7%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#000000, 8%), #ffffff, 87%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted:hover, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected:hover, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked:hover { + background-color: st-lighten(st-lighten(#000000, 8%), 7%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted:active, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected:active, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked:active { + background-color: st-lighten(st-lighten(#000000, 8%), 9%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: st-transparentize(#ffffff, 0.5); + background-color: #000000; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:drop { + background-color: st-transparentize(-st-accent-color, 0.8); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device .audio-selection-device-box { + padding: 12px; + spacing: 12px; } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device .audio-selection-device-icon { + icon-size: 64px; } + +/* Welcome dialog */ +.welcome-dialog-image { + background-image: url("resource:///org/gnome/shell/theme/gnome-shell-start.svg"); + background-size: contain; + /* Reasonable maximum dimensions */ + height: 300px; + width: 300px; } + +/* Access portal dialog */ +.access-dialog { + text-align: center; } + +/* OSD */ +.osd-window { + text-align: center; + font-weight: bold; + spacing: 12px; + padding: 12px 18px; + margin-bottom: 4em; } + .osd-window > * { + spacing: 8px; } + .osd-window StIcon { + icon-size: 32px; } + .osd-window StLabel:ltr { + margin-right: 6px; } + .osd-window StLabel:rtl { + margin-left: 6px; } + .osd-window .level { + margin-bottom: 4px; + min-width: 160px; + -barlevel-height: 6px; + -barlevel-background-color: rgba(255, 255, 255, 0.1); + -barlevel-active-background-color: #ffffff; + -barlevel-overdrive-color: #c01c28; + -barlevel-overdrive-separator-width: 3px; } + .osd-window .level:first-child { + margin-bottom: 0; } + .osd-window .level:ltr { + margin-right: 6px; } + .osd-window .level:rtl { + margin-left: 6px; } + - .osd-monitor-label { ++.osd-monitor-label, .osd-break-countdown-label { + background-color: -st-accent-color; + color: -st-accent-fg-color; + border-radius: 16px; + font-size: 3em; + font-weight: bold; + font-feature-settings: "tnum"; + margin: 12px; + padding: 12px; + text-align: center; + min-width: 1.5em; } + +/* Pad OSD */ +.pad-osd-window { + padding: 32px; + background-color: rgba(0, 0, 0, 0.8); } + .pad-osd-window .pad-osd-title-box { + spacing: 12px; } + .pad-osd-window .pad-osd-title-menu-box { + spacing: 6px; } + +.combo-box-label { + width: 15em; } + +/* App Switcher */ +.switcher-popup { + padding: 0; + spacing: 24px; } + +.switcher-list { + padding: 12px; + border-radius: 28px; + box-shadow: 0 8px 8px 0 transparent; } + .switcher-list .switcher-list-item-container { + spacing: 12px; } + .switcher-list .item-box { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: #000000; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; - border: none; } ++ border: none; ++ background-color: transparent; } + .switcher-list .item-box:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, rgba(0, 0, 0, 0.25), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(0, 0, 0, 0.25), 5%); } + .switcher-list .item-box:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); } + .switcher-list .item-box:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#000000, 7%), #ffffff, 87%); } + .switcher-list .item-box:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#000000, 9%), #ffffff, 87%); } + .switcher-list .item-box:active:hover { + background-color: st-lighten(st-lighten(#000000, 9%), 7%); } + .switcher-list .item-box:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); } + .switcher-list .item-box:highlighted, .switcher-list .item-box:selected, .switcher-list .item-box:checked { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#000000, 8%), #ffffff, 87%); } + .switcher-list .item-box:highlighted:hover, .switcher-list .item-box:selected:hover, .switcher-list .item-box:checked:hover { + background-color: st-lighten(st-lighten(#000000, 8%), 7%); } + .switcher-list .item-box:highlighted:active, .switcher-list .item-box:selected:active, .switcher-list .item-box:checked:active { + background-color: st-lighten(st-lighten(#000000, 8%), 9%); } + .switcher-list .item-box:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: st-transparentize(#ffffff, 0.5); + background-color: #000000; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + .switcher-list .item-box:drop { + background-color: st-transparentize(-st-accent-color, 0.8); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); } + .switcher-list .item-box:hover { + background: none; } + .switcher-list .item-box:selected { + background-color: rgba(255, 255, 255, 0.2); } + .switcher-list .item-box:selected { + background-color: rgba(255, 255, 255, 0.3); } + .switcher-list .separator { + width: 1px; + background: rgba(255, 255, 255, 0.5); } + .switcher-list .thumbnail-box { + padding: 2px; + spacing: 6px; } + .switcher-list .thumbnail { + width: 256px; + border-radius: 8px; } + +.switcher-arrow { + border-color: rgba(255, 255, 255, 0.8); + color: rgba(255, 255, 255, 0.8); } + .switcher-arrow:highlighted { + border-color: #ffffff; + color: #ffffff; } + +.input-source-switcher-symbol { + font-size: 34pt; + width: 96px; + height: 96px; } + +.cycler-highlight { + border: 5px solid -st-accent-color; } + +/* Workspace Switcher */ +.workspace-switcher { + margin-bottom: 4em; + spacing: 12px; + padding: 12px 18px; } + +.ws-switcher-indicator { + background-color: rgba(255, 255, 255, 0.5); + padding: 2.6666666667px; + margin: 13.3333333333px; + border-radius: 32px; } + .ws-switcher-indicator:active { + background-color: #ffffff; + padding: 5.3333333333px; + margin: 10.6666666667px; } + +.screenshot-ui-panel { + border-radius: 32px; + padding: 18px; + padding-bottom: 12px; + margin-bottom: 4em; + spacing: 12px; } + +.screenshot-ui-close-button { + padding: 6px !important; + margin-top: 12px; + box-shadow: 0 2px 4px 0 transparent; } + .screenshot-ui-close-button.left { + margin-left: 12px; } + .screenshot-ui-close-button.right { + margin-right: 12px; } + +.screenshot-ui-type-button { + min-width: 48px; + padding: 12px 18px; + border-radius: 14px; } + .screenshot-ui-type-button .icon-label-button-container { + spacing: 0.409em; } + .screenshot-ui-type-button .icon-label-button-container > StIcon { + icon-size: 32px; } + +.screenshot-ui-capture-button { + width: 32px; + height: 32px; + border-radius: 999px; + border: 4px #ffffff; + padding: 4px; } + .screenshot-ui-capture-button .screenshot-ui-capture-button-circle { + background-color: #ffffff; + transition-duration: 200ms; + border-radius: 999px; } + .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:hover, .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:focus { + background-color: #4d4d4d; } + .screenshot-ui-capture-button:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:focus .screenshot-ui-capture-button-circle { + background-color: #cccccc; } + .screenshot-ui-capture-button:active .screenshot-ui-capture-button-circle { + background-color: gray; } + .screenshot-ui-capture-button:cast .screenshot-ui-capture-button-circle { + background-color: #c01c28; } + .screenshot-ui-capture-button:cast:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:cast:focus .screenshot-ui-capture-button-circle { + background-color: #d61f2d; } + .screenshot-ui-capture-button:cast:active .screenshot-ui-capture-button-circle { + background-color: #a11722; } + +.screenshot-ui-shot-cast-container { + background-color: rgba(255, 255, 255, 0.1); + border-radius: 999px; + padding: 3px; + spacing: 3px; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); } + +.screenshot-ui-shot-cast-button { + padding: 6px 12px; + background-color: transparent; + border-radius: 999px; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); } + .screenshot-ui-shot-cast-button > StIcon { + icon-size: 16px; } + .screenshot-ui-shot-cast-button:hover, .screenshot-ui-shot-cast-button:focus { + background-color: rgba(255, 255, 255, 0.2); } + .screenshot-ui-shot-cast-button:active { + background-color: rgba(255, 255, 255, 0.5); } + .screenshot-ui-shot-cast-button:checked { + background-color: #ffffff; + color: #000000; } + .screenshot-ui-shot-cast-button:insensitive { + color: rgba(255, 255, 255, 0.5); } + +.screenshot-ui-area-indicator-shade { + background-color: rgba(0, 0, 0, 0.3); } + +.screenshot-ui-area-selector .screenshot-ui-area-indicator-shade { + background-color: rgba(0, 0, 0, 0.5); } + +.screenshot-ui-area-selector .screenshot-ui-area-indicator-selection { + border: 2px white; } + +.screenshot-ui-area-selector-handle { + border-radius: 999px; + background-color: white; + box-shadow: 0 1px 3px 2px transparent; + width: 24px; + height: 24px; } + +.screenshot-ui-window-selector { + background-color: #000000; } + .screenshot-ui-window-selector .screenshot-ui-window-selector-window-container { + margin: 100px; } + .screenshot-ui-window-selector:primary-monitor .screenshot-ui-window-selector-window-container { + margin-bottom: 200px; } + +.screenshot-ui-window-selector-window-border { + transition-duration: 200ms; + border-radius: 16px; + border: 6px transparent; } + +.screenshot-ui-window-selector-check { + transition-duration: 200ms; + color: transparent; + border-radius: 999px; + border-width: 12px; + icon-size: 24px; } + +.screenshot-ui-window-selector-window:hover .screenshot-ui-window-selector-window-border { + border-color: st-darken(-st-accent-color, 15%); } + +.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-window-border { + border-color: -st-accent-color; + background-color: st-transparentize(-st-accent-color, 0.8); } + +.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-check { + color: -st-accent-fg-color; + background-color: -st-accent-color; } + +.screenshot-ui-screen-selector { + transition-duration: 200ms; + background-color: rgba(0, 0, 0, 0.5); } + .screenshot-ui-screen-selector:hover { + background-color: rgba(0, 0, 0, 0.3); } + .screenshot-ui-screen-selector:active { + background-color: rgba(0, 0, 0, 0.7); } + .screenshot-ui-screen-selector:checked { + background-color: transparent; + border: 2px white; } + +.screenshot-ui-tooltip { + text-align: center; + -y-offset: 24px; } + +/* Top Bar */ +#panel { + background-color: #000000; + font-weight: bold; + height: 2.2em; + transition-duration: 250ms; } + #panel .panel-button { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; + color: #ffffff; + box-shadow: inset 0 0 0 100px transparent; + -natural-hpadding: 12px; + -minimum-hpadding: 6px; } + #panel .panel-button:focus, #panel .panel-button:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); } + #panel .panel-button:active, #panel .panel-button:checked { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); } + #panel .panel-button:active:hover, #panel .panel-button:checked:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); } + #panel .panel-button .system-status-icon { + icon-size: 1.091em; + padding: 0 6px; + margin: 0 4px; } + #panel .panel-button .app-menu-icon { + -st-icon-style: symbolic; } + #panel .panel-button .panel-status-menu-box, + #panel .panel-button .panel-status-indicators-box { + spacing: 4px; } + #panel .panel-button .panel-status-menu-box > .system-status-icon, + #panel .panel-button .panel-status-indicators-box > .system-status-icon { + padding: 0; } + #panel .panel-button#panelActivities StBoxLayout { + padding: 0 0.2045em; + spacing: 5px; } + #panel .panel-button#panelActivities .workspace-dot { + border-radius: 999px; + min-width: 0.5455em; + min-height: 0.5455em; + background-color: #ffffff; } + #panel .panel-button.screen-recording-indicator StBoxLayout, #panel .panel-button.screen-sharing-indicator StBoxLayout { + spacing: 0.409em; } + #panel .panel-button.screen-recording-indicator StIcon, #panel .panel-button.screen-sharing-indicator StIcon { + icon-size: 1.091em; } + #panel .panel-button.screen-recording-indicator { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; - color: whitesmoke; ++ color: #fafafb; + box-shadow: inset 0 0 0 100px #c01c28; } + #panel .panel-button.screen-recording-indicator:focus, #panel .panel-button.screen-recording-indicator:hover { + box-shadow: inset 0 0 0 100px #d61f2d; } + #panel .panel-button.screen-recording-indicator:active, #panel .panel-button.screen-recording-indicator:checked { + box-shadow: inset 0 0 0 100px #e02a37; } + #panel .panel-button.screen-recording-indicator:active:hover, #panel .panel-button.screen-recording-indicator:checked:hover { + box-shadow: inset 0 0 0 100px #e13340; } + #panel .panel-button.screen-sharing-indicator { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; - color: whitesmoke; ++ color: #fafafb; + box-shadow: inset 0 0 0 100px #ff7800; } + #panel .panel-button.screen-sharing-indicator:focus, #panel .panel-button.screen-sharing-indicator:hover { + box-shadow: inset 0 0 0 100px #ff861a; } + #panel .panel-button.screen-sharing-indicator:active, #panel .panel-button.screen-sharing-indicator:checked { + box-shadow: inset 0 0 0 100px #ff902e; } + #panel .panel-button.screen-sharing-indicator:active:hover, #panel .panel-button.screen-sharing-indicator:checked:hover { + box-shadow: inset 0 0 0 100px #ff9638; } + #panel .panel-button.clock-display { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; + color: #ffffff; + box-shadow: inset 0 0 0 100px transparent; + background: none !important; + box-shadow: none !important; + border: none !important; } + #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); } + #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:checked { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); } + #panel .panel-button.clock-display:active:hover, #panel .panel-button.clock-display:checked:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); } + #panel .panel-button.clock-display .clock { + transition-duration: 150ms; + border: 3px solid transparent; + border-radius: 999px; } + #panel .panel-button.clock-display:focus .clock, #panel .panel-button.clock-display:hover .clock { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); } + #panel .panel-button.clock-display:active .clock, #panel .panel-button.clock-display:checked .clock { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); } + #panel .panel-button.clock-display:active .clock:hover, #panel .panel-button.clock-display:checked .clock:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); } + #panel .panel-button.clock-display .messages-indicator { + icon-size: 1.091em; } + #panel:overview, #panel.unlock-screen, #panel.login-screen { + background-color: transparent; } + #panel:overview .panel-button.screen-recording-indicator, #panel.unlock-screen .panel-button.screen-recording-indicator, #panel.login-screen .panel-button.screen-recording-indicator { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; - color: whitesmoke; ++ color: #fafafb; + box-shadow: inset 0 0 0 100px #c01c28; } + #panel:overview .panel-button.screen-recording-indicator:focus, #panel:overview .panel-button.screen-recording-indicator:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:focus, #panel.unlock-screen .panel-button.screen-recording-indicator:hover, #panel.login-screen .panel-button.screen-recording-indicator:focus, #panel.login-screen .panel-button.screen-recording-indicator:hover { + box-shadow: inset 0 0 0 100px #d61f2d; } + #panel:overview .panel-button.screen-recording-indicator:active, #panel:overview .panel-button.screen-recording-indicator:checked, #panel.unlock-screen .panel-button.screen-recording-indicator:active, #panel.unlock-screen .panel-button.screen-recording-indicator:checked, #panel.login-screen .panel-button.screen-recording-indicator:active, #panel.login-screen .panel-button.screen-recording-indicator:checked { + box-shadow: inset 0 0 0 100px #e02a37; } + #panel:overview .panel-button.screen-recording-indicator:active:hover, #panel:overview .panel-button.screen-recording-indicator:checked:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:active:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:checked:hover, #panel.login-screen .panel-button.screen-recording-indicator:active:hover, #panel.login-screen .panel-button.screen-recording-indicator:checked:hover { + box-shadow: inset 0 0 0 100px #e13340; } + #panel:overview .panel-button.screen-sharing-indicator, #panel.unlock-screen .panel-button.screen-sharing-indicator, #panel.login-screen .panel-button.screen-sharing-indicator { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; - color: whitesmoke; ++ color: #fafafb; + box-shadow: inset 0 0 0 100px #ff7800; } + #panel:overview .panel-button.screen-sharing-indicator:focus, #panel:overview .panel-button.screen-sharing-indicator:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:focus, #panel.unlock-screen .panel-button.screen-sharing-indicator:hover, #panel.login-screen .panel-button.screen-sharing-indicator:focus, #panel.login-screen .panel-button.screen-sharing-indicator:hover { + box-shadow: inset 0 0 0 100px #ff861a; } + #panel:overview .panel-button.screen-sharing-indicator:active, #panel:overview .panel-button.screen-sharing-indicator:checked, #panel.unlock-screen .panel-button.screen-sharing-indicator:active, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked, #panel.login-screen .panel-button.screen-sharing-indicator:active, #panel.login-screen .panel-button.screen-sharing-indicator:checked { + box-shadow: inset 0 0 0 100px #ff902e; } + #panel:overview .panel-button.screen-sharing-indicator:active:hover, #panel:overview .panel-button.screen-sharing-indicator:checked:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:active:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked:hover, #panel.login-screen .panel-button.screen-sharing-indicator:active:hover, #panel.login-screen .panel-button.screen-sharing-indicator:checked:hover { + box-shadow: inset 0 0 0 100px #ff9638; } + #panel.unlock-screen .panel-button, #panel.login-screen .panel-button { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; + color: #ffffff; + box-shadow: inset 0 0 0 100px transparent; } + #panel.unlock-screen .panel-button:focus, #panel.unlock-screen .panel-button:hover, #panel.login-screen .panel-button:focus, #panel.login-screen .panel-button:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); } + #panel.unlock-screen .panel-button:active, #panel.unlock-screen .panel-button:checked, #panel.login-screen .panel-button:active, #panel.login-screen .panel-button:checked { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); } + #panel.unlock-screen .panel-button:active:hover, #panel.unlock-screen .panel-button:checked:hover, #panel.login-screen .panel-button:active:hover, #panel.login-screen .panel-button:checked:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); } + #panel.unlock-screen .panel-button.clock-display, #panel.login-screen .panel-button.clock-display { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; + color: #ffffff; + box-shadow: inset 0 0 0 100px transparent; + background: none !important; + box-shadow: none !important; + border: none !important; } + #panel.unlock-screen .panel-button.clock-display:focus, #panel.unlock-screen .panel-button.clock-display:hover, #panel.login-screen .panel-button.clock-display:focus, #panel.login-screen .panel-button.clock-display:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); } + #panel.unlock-screen .panel-button.clock-display:active, #panel.unlock-screen .panel-button.clock-display:checked, #panel.login-screen .panel-button.clock-display:active, #panel.login-screen .panel-button.clock-display:checked { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); } + #panel.unlock-screen .panel-button.clock-display:active:hover, #panel.unlock-screen .panel-button.clock-display:checked:hover, #panel.login-screen .panel-button.clock-display:active:hover, #panel.login-screen .panel-button.clock-display:checked:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); } + #panel.unlock-screen .panel-button.clock-display .clock, #panel.login-screen .panel-button.clock-display .clock { + transition-duration: 150ms; + border: 3px solid transparent; + border-radius: 999px; } + #panel.unlock-screen .panel-button.clock-display:focus .clock, #panel.unlock-screen .panel-button.clock-display:hover .clock, #panel.login-screen .panel-button.clock-display:focus .clock, #panel.login-screen .panel-button.clock-display:hover .clock { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); } + #panel.unlock-screen .panel-button.clock-display:active .clock, #panel.unlock-screen .panel-button.clock-display:checked .clock, #panel.login-screen .panel-button.clock-display:active .clock, #panel.login-screen .panel-button.clock-display:checked .clock { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); } + #panel.unlock-screen .panel-button.clock-display:active .clock:hover, #panel.unlock-screen .panel-button.clock-display:checked .clock:hover, #panel.login-screen .panel-button.clock-display:active .clock:hover, #panel.login-screen .panel-button.clock-display:checked .clock:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); } + #panel:overview .panel-button { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; + color: #ffffff; + box-shadow: inset 0 0 0 100px transparent; } + #panel:overview .panel-button:focus, #panel:overview .panel-button:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); } + #panel:overview .panel-button:active, #panel:overview .panel-button:checked { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); } + #panel:overview .panel-button:active:hover, #panel:overview .panel-button:checked:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); } + #panel:overview .panel-button#panelActivities .workspace-dot { + background-color: #ffffff; } + #panel:overview .panel-button.clock-display { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; + color: #ffffff; + box-shadow: inset 0 0 0 100px transparent; + background: none !important; + box-shadow: none !important; + border: none !important; } + #panel:overview .panel-button.clock-display:focus, #panel:overview .panel-button.clock-display:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); } + #panel:overview .panel-button.clock-display:active, #panel:overview .panel-button.clock-display:checked { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); } + #panel:overview .panel-button.clock-display:active:hover, #panel:overview .panel-button.clock-display:checked:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); } + #panel:overview .panel-button.clock-display .clock { + transition-duration: 150ms; + border: 3px solid transparent; + border-radius: 999px; } + #panel:overview .panel-button.clock-display:focus .clock, #panel:overview .panel-button.clock-display:hover .clock { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); } + #panel:overview .panel-button.clock-display:active .clock, #panel:overview .panel-button.clock-display:checked .clock { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); } + #panel:overview .panel-button.clock-display:active .clock:hover, #panel:overview .panel-button.clock-display:checked .clock:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); } + #panel .panel-status-indicators-box, + #panel .panel-status-menu-box { + spacing: 2px; } + #panel .power-status.panel-status-indicators-box { + spacing: 0; } + #panel .privacy-indicator { + color: #ff7800; } + +#appMenu { + spacing: 0.409em; } + #appMenu .label-shadow { + color: transparent; } + +#appMenu .panel-status-menu-box { + padding: 0 0.409em; + spacing: 0.409em; } + +.clock-display-box { + spacing: 2px; } + .clock-display-box .clock { + padding-left: 0.818em; + padding-right: 0.818em; } + +/* Activities Ripple */ +.ripple-box { + background-color: rgba(255, 255, 255, 0.2); + box-shadow: 0 0 2px 2px rgba(255, 255, 255, 0.2); + width: 52px; + height: 52px; + border-radius: 0 0 52px 0; } + .ripple-box:rtl { + border-radius: 0 0 0 52px; } + +.quick-settings { + padding: 18px; + border-radius: 36px; } + .quick-settings .icon-button, .quick-settings .login-dialog-button.cancel-button, .quick-settings .login-dialog-button.switch-user-button, .quick-settings .login-dialog-button.login-dialog-session-list-button, .quick-settings .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-settings .pager-button, .quick-settings .message .message-header .message-expand-button, .message .message-header .quick-settings .message-expand-button, + .quick-settings .message .message-header .message-close-button, + .message .message-header .quick-settings .message-close-button, .quick-settings .screenshot-ui-show-pointer-button, .quick-settings .button { + padding: 10.5px; } + +.quick-settings-grid { + spacing-rows: 12px; + spacing-columns: 12px; } + - .quick-toggle, .quick-menu-toggle { ++.quick-toggle, .quick-toggle-has-menu { + border-radius: 999px; + min-width: 12em; + max-width: 12em; - min-height: 3.273em; - border: none; } ++ min-height: 3.273em; } + +.quick-toggle { - background-color: none; + /* Move padding into the box; this is to allow menu arrows + to extend to the border */ } + .quick-toggle > StBoxLayout { + spacing: 9px; } + .quick-toggle.button { + padding: 0; } + .quick-toggle > StBoxLayout { + padding: 0 12px; } + .quick-toggle:ltr > StBoxLayout { + padding-left: 15px; } + .quick-toggle:rtl > StBoxLayout { + padding-right: 15px; } - .quick-toggle .quick-toggle-title { - font-weight: bold; } - .quick-toggle StBoxLayout > .quick-toggle-subtitle { ++ .quick-toggle .quick-toggle-subtitle { + font-weight: normal; } + .quick-toggle .quick-toggle-icon { + icon-size: 1.091em; } + - .quick-menu-toggle .quick-toggle { ++.quick-toggle-has-menu .quick-toggle { + min-width: auto; + max-width: auto; } - .quick-menu-toggle .quick-toggle:ltr { ++ .quick-toggle-has-menu .quick-toggle:ltr { + border-radius: 999px 0 0 999px; } - .quick-menu-toggle .quick-toggle:ltr > StBoxLayout { - padding-right: 0.6135em; } - .quick-menu-toggle .quick-toggle:rtl { ++ .quick-toggle-has-menu .quick-toggle:ltr > StBoxLayout { ++ padding-right: 0.6135em; } ++ .quick-toggle-has-menu .quick-toggle:rtl { + border-radius: 0 999px 999px 0; } - .quick-menu-toggle .quick-toggle:rtr > StBoxLayout { - padding-left: 0.6135em; } - .quick-menu-toggle .quick-toggle:ltr:last-child { ++ .quick-toggle-has-menu .quick-toggle:rtl > StBoxLayout { ++ padding-left: 0.6135em; } ++ .quick-toggle-has-menu .quick-toggle:ltr:last-child { + border-radius: 999px; } - .quick-menu-toggle .quick-toggle:rtl:last-child { ++ .quick-toggle-has-menu .quick-toggle:rtl:last-child { + border-radius: 999px; } + - .quick-menu-toggle .quick-toggle-arrow { - padding: 0.409em 0.71575em; - border-width: 0; - border-color: rgba(255, 255, 255, 0.25); } - .quick-menu-toggle .quick-toggle-arrow:checked { - border-color: st-lighten(-st-accent-color, 30%); } - .quick-menu-toggle .quick-toggle-arrow:ltr { - border-radius: 0 999px 999px 0; - border-left-width: 1px; } - .quick-menu-toggle .quick-toggle-arrow:rtl { - border-radius: 999px 0 0 999px; - border-right-width: 1px; } ++.quick-toggle-has-menu .quick-toggle-menu-button { ++ padding: 0.409em 0.71575em; } ++ .quick-toggle-has-menu .quick-toggle-menu-button:ltr { ++ border-radius: 0 999px 999px 0; } ++ .quick-toggle-has-menu .quick-toggle-menu-button:rtl { ++ border-radius: 999px 0 0 999px; } ++ ++.quick-toggle-has-menu .quick-toggle-separator { ++ width: 1px; } ++ ++.quick-toggle-has-menu .quick-toggle-menu-button { ++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); ++ color: #ffffff; ++ background-color: st-mix(st-mix(#ffffff, #525252, 9%), #ffffff, 87%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:focus { ++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); ++ color: #ffffff; ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #525252, 9%), #ffffff, 87%), 5%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:focus:hover { ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #525252, 9%), 4%), #ffffff, 87%), 5%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:hover { ++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); ++ color: #ffffff; ++ background-color: st-mix(st-lighten(st-mix(#ffffff, #525252, 9%), 4%), #ffffff, 87%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:active { ++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); ++ color: #ffffff; ++ background-color: st-mix(st-lighten(st-mix(#ffffff, #525252, 9%), 9%), #ffffff, 87%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:active:hover { ++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #525252, 9%), 9%), 4%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:active:focus { ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #525252, 9%), 9%), #ffffff, 87%), 5%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked { ++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); ++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); ++ box-shadow: none; ++ border: none; ++ color: -st-accent-fg-color; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 75%), #ffffff, 87%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:focus { ++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); ++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); ++ box-shadow: none; ++ border: none; ++ color: -st-accent-fg-color; ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ box-shadow: inset 0 0 0 2px st-transparentize(st-lighten(-st-accent-color, 30%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(-st-accent-color, #ffffff, 75%), #ffffff, 87%), 5%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:focus:hover { ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(-st-accent-color, #ffffff, 75%), 4%), #ffffff, 87%), 5%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:hover { ++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); ++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); ++ box-shadow: none; ++ border: none; ++ color: -st-accent-fg-color; ++ background-color: st-mix(st-lighten(st-mix(-st-accent-color, #ffffff, 75%), 4%), #ffffff, 87%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:active { ++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); ++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); ++ box-shadow: none; ++ border: none; ++ color: -st-accent-fg-color; ++ background-color: st-mix(st-lighten(st-mix(-st-accent-color, #ffffff, 75%), 9%), #ffffff, 87%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:active:hover { ++ background-color: st-lighten(st-lighten(st-mix(-st-accent-color, #ffffff, 75%), 9%), 4%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:active:focus { ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(-st-accent-color, #ffffff, 75%), 9%), #ffffff, 87%), 5%); } ++ ++.quick-toggle-has-menu:checked .quick-toggle-separator { ++ background-color: transparent; } ++ ++.quick-toggle-has-menu .quick-toggle-separator { ++ background-color: transparent; } + +.quick-slider > StBoxLayout { + spacing: 6px; } + +.quick-slider .icon-button, .quick-slider .login-dialog-button.cancel-button, .quick-slider .login-dialog-button.switch-user-button, .quick-slider .login-dialog-button.login-dialog-session-list-button, .quick-slider .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-slider .pager-button, .quick-slider .message .message-header .message-expand-button, .message .message-header .quick-slider .message-expand-button, +.quick-slider .message .message-header .message-close-button, +.message .message-header .quick-slider .message-close-button, .quick-slider .screenshot-ui-show-pointer-button { + padding: 6px; } + +.quick-slider .slider-bin { + padding: 6px; + border-radius: 999px; } + .quick-slider .slider-bin:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); } + .quick-slider .slider-bin:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); } + +.quick-toggle-menu { + border-radius: 24px; + margin: 12px 18px 0; } + .quick-toggle-menu:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%); } + .quick-toggle-menu .popup-menu-item > StIcon { + -st-icon-style: symbolic; + icon-size: 1.091em; } + .quick-toggle-menu .header { + spacing-rows: 3px; + spacing-columns: 12px; + padding-bottom: 12px; } + .quick-toggle-menu .header .icon { + icon-size: 1.6365em; + border-radius: 999px; + padding: 9px; + background-color: rgba(255, 255, 255, 0.2); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); } + .quick-toggle-menu .header .icon.active { + background-color: -st-accent-color; + color: -st-accent-fg-color; } + .quick-toggle-menu .header .icon.active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + +.quick-settings-system-item > StBoxLayout { + spacing: 12px; } + +.quick-settings-system-item .power-item { + min-height: 0; + min-width: 0; } + .quick-settings-system-item .power-item:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%); + background-color: transparent; } + +.nm-network-item .wireless-secure-icon { + icon-size: 0.5455em; } + +.bt-device-item .popup-menu-icon { + -st-icon-style: symbolic; } + +.bt-menu-placeholder.popup-menu-item { + text-align: center; + padding: 2em 4em; } + +.device-subtitle { + color: rgba(255, 255, 255, 0.5); } + +.keyboard-brightness-level { + spacing: 6px; } + +.background-apps-quick-toggle { + min-height: 2.728em; + background-color: transparent; } + .background-apps-quick-toggle StIcon { + icon-size: 1.091em !important; } + +.background-app-item .popup-menu-icon { + icon-size: 32px !important; + -st-icon-style: regular !important; } + +.background-app-item .icon-button, .background-app-item .login-dialog-button.cancel-button, .background-app-item .login-dialog-button.switch-user-button, .background-app-item .login-dialog-button.login-dialog-session-list-button, .background-app-item .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .background-app-item .pager-button, .background-app-item .message .message-header .message-expand-button, .message .message-header .background-app-item .message-expand-button, +.background-app-item .message .message-header .message-close-button, +.message .message-header .background-app-item .message-close-button, .background-app-item .screenshot-ui-show-pointer-button { + padding: 6px; + background-color: rgba(255, 255, 255, 0.13); } + .background-app-item .icon-button:hover, .background-app-item .login-dialog-button.cancel-button:hover, .background-app-item .login-dialog-button.switch-user-button:hover, .background-app-item .login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .calendar .calendar-month-header .pager-button:hover, .calendar .calendar-month-header .background-app-item .pager-button:hover, .background-app-item .message .message-header .message-expand-button:hover, .message .message-header .background-app-item .message-expand-button:hover, + .background-app-item .message .message-header .message-close-button:hover, + .message .message-header .background-app-item .message-close-button:hover, .background-app-item .screenshot-ui-show-pointer-button:hover { + background-color: rgba(255, 255, 255, 0.22); } + .background-app-item .icon-button:active, .background-app-item .login-dialog-button.cancel-button:active, .background-app-item .login-dialog-button.switch-user-button:active, .background-app-item .login-dialog-button.login-dialog-session-list-button:active, .background-app-item .calendar .calendar-month-header .pager-button:active, .calendar .calendar-month-header .background-app-item .pager-button:active, .background-app-item .message .message-header .message-expand-button:active, .message .message-header .background-app-item .message-expand-button:active, + .background-app-item .message .message-header .message-close-button:active, + .message .message-header .background-app-item .message-close-button:active, .background-app-item .screenshot-ui-show-pointer-button:active { + background-color: rgba(255, 255, 255, 0.31); } + +.background-app-item .spinner { + padding: 6px; } + +.background-app-item.popup-inactive-menu-item { + color: #ffffff; } + +/* OVERVIEW */ +.secondary-monitor-workspaces { + spacing: 12px; } + +#overviewGroup { + background-color: #000000; } + +/* Window Picker */ +.window-picker { + spacing: 6px; } + +.window-icon { + background-color: #000000; + padding: 12px; + border-radius: 16px; + border: 2px solid rgba(255, 255, 255, 0.4); + margin: 18px; } + +.window-close, .screenshot-ui-close-button { + background-color: rgba(31, 31, 31, 0.98); + color: #ffffff; + border-radius: 999px; + box-shadow: 0 2px 4px 0 transparent; + padding: 3px; + height: 32px; + width: 32px; + transition-duration: 100ms; + border: 2px solid transparent; + border-color: rgba(255, 255, 255, 0.4); } + .window-close StIcon, .screenshot-ui-close-button StIcon { + icon-size: 24px; } + .window-close:hover, .screenshot-ui-close-button:hover { + background-color: rgba(48, 48, 48, 0.98); } + .window-close:active, .screenshot-ui-close-button:active { + background-color: rgba(64, 64, 64, 0.98); } + +.workspace-background { + border-radius: 30px; + background-color: rgba(3, 2, 1, 0); + box-shadow: 0 4px 16px 4px transparent; } + +.search-entry { + border-radius: 999px; + margin-top: 12px; + margin-bottom: 6px; + width: 24em; } + .search-entry .search-entry-icon { + icon-size: 1.091em; + margin-top: 2px; + padding: 0 4px; } + +/* Search */ +#searchResults { + margin: 0 4px; } + +#searchResultsContent { + max-width: 1044px; } + +.search-section { + spacing: 18px; } + .search-section .search-section-separator { + height: 8px; + background-color: transparent; } + +.search-section-content { + background-color: #252525; + color: #ffffff; + border-radius: 24px; + padding: 12px; + margin: 0 12px; + border: 2px solid transparent; + border-color: rgba(255, 255, 255, 0.4); } + +.list-search-result, .search-provider-icon { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: #252525; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; ++ background-color: transparent; + border-radius: 13.2px; } + .list-search-result:focus, .search-provider-icon:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, rgba(37, 37, 37, 0.25), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(37, 37, 37, 0.25), 5%); } + .list-search-result:focus:hover, .search-provider-icon:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 7%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 7%), #ffffff, 87%), 5%); } + .list-search-result:hover, .search-provider-icon:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#252525, 7%), #ffffff, 87%); } + .list-search-result:active, .search-provider-icon:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#252525, 9%), #ffffff, 87%); } + .list-search-result:active:hover, .search-provider-icon:active:hover { + background-color: st-lighten(st-lighten(#252525, 9%), 7%); } + .list-search-result:active:focus, .search-provider-icon:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); } + .list-search-result:highlighted, .search-provider-icon:highlighted, .list-search-result:selected, .search-provider-icon:selected, .list-search-result:checked, .search-provider-icon:checked { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#252525, 8%), #ffffff, 87%); } + .list-search-result:highlighted:hover, .search-provider-icon:highlighted:hover, .list-search-result:selected:hover, .search-provider-icon:selected:hover, .list-search-result:checked:hover, .search-provider-icon:checked:hover { + background-color: st-lighten(st-lighten(#252525, 8%), 7%); } + .list-search-result:highlighted:active, .search-provider-icon:highlighted:active, .list-search-result:selected:active, .search-provider-icon:selected:active, .list-search-result:checked:active, .search-provider-icon:checked:active { + background-color: st-lighten(st-lighten(#252525, 8%), 9%); } + .list-search-result:insensitive, .search-provider-icon:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: st-transparentize(#ffffff, 0.5); + background-color: #252525; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + .list-search-result:drop, .search-provider-icon:drop { + background-color: st-transparentize(-st-accent-color, 0.8); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); } + +.search-statustext { + color: rgba(255, 255, 255, 0.8); } + +.grid-search-results { + spacing: 30px; } + +.search-provider-icon:ltr { + margin-right: 4px; } + +.search-provider-icon:rtl { + margin-left: 4px; } + +.search-provider-icon .list-search-provider-content { + spacing: 12px; } + .search-provider-icon .list-search-provider-content .list-search-provider-details { + width: 120px; + color: #ffffff; } + +.list-search-results { + spacing: 6px; } + +.list-search-result .list-search-result-content { + spacing: 6px; } + +.list-search-result .list-search-result-title { + spacing: 12px; + font-weight: bold; } + +.list-search-result .list-search-result-description { + color: #868686; + color: #ffffff; } + +/* Dash */ +#dash { + padding-left: 6px; + padding-right: 6px; } + #dash .dash-background { + background-color: #252525; + border-radius: 28px; + padding-top: 12px; + padding-bottom: 12px; + padding-left: 10px; + padding-right: 10px; + box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.4); } + #dash .dash-item-container .placeholder { + background-image: none; + background-size: contain; + height: 32px; } + #dash .dash-item-container .empty-dash-drop-target { + width: 32px; + height: 32px; } + #dash .dash-item-container .show-apps, + #dash .dash-item-container .overview-tile, + #dash .dash-item-container .grid-search-result { + margin: 0 2px; + padding-bottom: 12px; } + #dash .dash-item-container .show-apps .overview-icon, + #dash .dash-item-container .overview-tile .overview-icon, + #dash .dash-item-container .grid-search-result .overview-icon { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: #252525; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + #dash .dash-item-container .show-apps:focus .overview-icon, + #dash .dash-item-container .overview-tile:focus .overview-icon, + #dash .dash-item-container .grid-search-result:focus .overview-icon { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, rgba(37, 37, 37, 0.25), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(37, 37, 37, 0.25), 5%); } + #dash .dash-item-container .show-apps:focus .overview-icon:hover, + #dash .dash-item-container .overview-tile:focus .overview-icon:hover, + #dash .dash-item-container .grid-search-result:focus .overview-icon:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 7%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 7%), #ffffff, 87%), 5%); } + #dash .dash-item-container .show-apps:hover .overview-icon, + #dash .dash-item-container .overview-tile:hover .overview-icon, + #dash .dash-item-container .grid-search-result:hover .overview-icon { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#252525, 7%), #ffffff, 87%); } + #dash .dash-item-container .show-apps:active .overview-icon, + #dash .dash-item-container .overview-tile:active .overview-icon, + #dash .dash-item-container .grid-search-result:active .overview-icon { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#252525, 9%), #ffffff, 87%); } + #dash .dash-item-container .show-apps:active .overview-icon:hover, + #dash .dash-item-container .overview-tile:active .overview-icon:hover, + #dash .dash-item-container .grid-search-result:active .overview-icon:hover { + background-color: st-lighten(st-lighten(#252525, 9%), 7%); } + #dash .dash-item-container .show-apps:active .overview-icon:focus, + #dash .dash-item-container .overview-tile:active .overview-icon:focus, + #dash .dash-item-container .grid-search-result:active .overview-icon:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); } + #dash .dash-item-container .show-apps:checked .overview-icon, + #dash .dash-item-container .overview-tile:checked .overview-icon, + #dash .dash-item-container .grid-search-result:checked .overview-icon { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#252525, 8%), #ffffff, 87%); } + #dash .dash-item-container .show-apps:checked .overview-icon:hover, + #dash .dash-item-container .overview-tile:checked .overview-icon:hover, + #dash .dash-item-container .grid-search-result:checked .overview-icon:hover { + background-color: st-lighten(st-lighten(#252525, 8%), 7%); } + #dash .dash-item-container .show-apps:checked .overview-icon:active, + #dash .dash-item-container .overview-tile:checked .overview-icon:active, + #dash .dash-item-container .grid-search-result:checked .overview-icon:active { + background-color: st-lighten(st-lighten(#252525, 8%), 9%); } + #dash .dash-item-container .app-grid-running-dot { + offset-y: -13px; } + #dash .dash-separator { + width: 1px; + margin-left: 4px; + margin-right: 4px; + background-color: rgba(255, 255, 255, 0.1); + width: 2px; + background-color: rgba(255, 255, 255, 0.4); } + #dash .dash-separator, + #dash .dash-background { + margin-bottom: 12px; } + +.dash-label { + -y-offset: 8px; } + +/* App Grid */ +.icon-grid { + row-spacing: 12px; + column-spacing: 12px; + max-row-spacing: 36px; + max-column-spacing: 36px; + page-padding-top: 24px; + page-padding-bottom: 24px; + page-padding-left: 18px; + page-padding-right: 18px; } + +/* App Icons */ +.overview-tile, .grid-search-result { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: #000000; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; ++ background-color: transparent; + border-radius: 24px; + padding: 12px; } + .overview-tile:focus, .grid-search-result:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, rgba(0, 0, 0, 0.25), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(0, 0, 0, 0.25), 5%); } + .overview-tile:focus:hover, .grid-search-result:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); } + .overview-tile:hover, .grid-search-result:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#000000, 7%), #ffffff, 87%); } + .overview-tile:active, .grid-search-result:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#000000, 9%), #ffffff, 87%); } + .overview-tile:active:hover, .grid-search-result:active:hover { + background-color: st-lighten(st-lighten(#000000, 9%), 7%); } + .overview-tile:active:focus, .grid-search-result:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); } + .overview-tile:highlighted, .grid-search-result:highlighted, .overview-tile:selected, .grid-search-result:selected, .overview-tile:checked, .grid-search-result:checked { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#000000, 8%), #ffffff, 87%); } + .overview-tile:highlighted:hover, .grid-search-result:highlighted:hover, .overview-tile:selected:hover, .grid-search-result:selected:hover, .overview-tile:checked:hover, .grid-search-result:checked:hover { + background-color: st-lighten(st-lighten(#000000, 8%), 7%); } + .overview-tile:highlighted:active, .grid-search-result:highlighted:active, .overview-tile:selected:active, .grid-search-result:selected:active, .overview-tile:checked:active, .grid-search-result:checked:active { + background-color: st-lighten(st-lighten(#000000, 8%), 9%); } + .overview-tile:insensitive, .grid-search-result:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: st-transparentize(#ffffff, 0.5); + background-color: #000000; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + .overview-tile:drop, .grid-search-result:drop { + background-color: st-transparentize(-st-accent-color, 0.8); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); } + .overview-tile .overview-icon.overview-icon-with-label > StBoxLayout, .grid-search-result .overview-icon.overview-icon-with-label > StBoxLayout { + spacing: 6px; } + +.app-folder { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%); } + .app-folder:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%), 5%); } + .app-folder:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%), 5%); } + .app-folder:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%); } + .app-folder:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%); } + .app-folder:active:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), 4%); } + .app-folder:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); } + .app-folder:highlighted, .app-folder:selected, .app-folder:checked { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 8%), #ffffff, 87%); } + .app-folder:highlighted:hover, .app-folder:selected:hover, .app-folder:checked:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 8%), 4%); } + .app-folder:highlighted:active, .app-folder:selected:active, .app-folder:checked:active { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 8%), 9%); } + .app-folder:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: st-transparentize(#ffffff, 0.5); + background-color: st-darken(st-mix(#ffffff, #000000, 9%), 3%); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + .app-folder:drop { + background-color: st-transparentize(-st-accent-color, 0.8); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); } + +.app-grid-running-dot { + height: 5px; + width: 5px; + border-radius: 5px; + background-color: #ffffff; + offset-y: 6px; } + +.app-folder-dialog-container { + padding-top: 2.2em; } + +.app-folder-dialog { + width: 720px; + height: 720px; + border-radius: 64px; + background-color: #252525; + color: #ffffff; + padding: 0 2px; + box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.4); } + .app-folder-dialog .folder-name-container { + padding: 24px 36px; + padding-bottom: 0; } + .app-folder-dialog .folder-name-container .folder-name-entry { + width: 12em; } + .app-folder-dialog .icon-button, .app-folder-dialog .login-dialog-button.cancel-button, .app-folder-dialog .login-dialog-button.switch-user-button, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button, .app-folder-dialog .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .app-folder-dialog .pager-button, .app-folder-dialog .message .message-header .message-expand-button, .message .message-header .app-folder-dialog .message-expand-button, + .app-folder-dialog .message .message-header .message-close-button, + .message .message-header .app-folder-dialog .message-close-button, .app-folder-dialog .screenshot-ui-show-pointer-button { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-mix(#ffffff, #252525, 9%), #ffffff, 87%); } + .app-folder-dialog .icon-button:hover, .app-folder-dialog .login-dialog-button.cancel-button:hover, .app-folder-dialog .login-dialog-button.switch-user-button:hover, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:hover, .app-folder-dialog .calendar .calendar-month-header .pager-button:hover, .calendar .calendar-month-header .app-folder-dialog .pager-button:hover, .app-folder-dialog .message .message-header .message-expand-button:hover, .message .message-header .app-folder-dialog .message-expand-button:hover, + .app-folder-dialog .message .message-header .message-close-button:hover, + .message .message-header .app-folder-dialog .message-close-button:hover, .app-folder-dialog .screenshot-ui-show-pointer-button:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #252525, 9%), 4%), #ffffff, 87%); } + .app-folder-dialog .icon-button:active, .app-folder-dialog .login-dialog-button.cancel-button:active, .app-folder-dialog .login-dialog-button.switch-user-button:active, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active, .app-folder-dialog .calendar .calendar-month-header .pager-button:active, .calendar .calendar-month-header .app-folder-dialog .pager-button:active, .app-folder-dialog .message .message-header .message-expand-button:active, .message .message-header .app-folder-dialog .message-expand-button:active, + .app-folder-dialog .message .message-header .message-close-button:active, + .message .message-header .app-folder-dialog .message-close-button:active, .app-folder-dialog .screenshot-ui-show-pointer-button:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #252525, 9%), 9%), #ffffff, 87%); } + .app-folder-dialog .icon-button:active:hover, .app-folder-dialog .login-dialog-button.cancel-button:active:hover, .app-folder-dialog .login-dialog-button.switch-user-button:active:hover, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active:hover, .app-folder-dialog .calendar .calendar-month-header .pager-button:active:hover, .calendar .calendar-month-header .app-folder-dialog .pager-button:active:hover, .app-folder-dialog .message .message-header .message-expand-button:active:hover, .message .message-header .app-folder-dialog .message-expand-button:active:hover, + .app-folder-dialog .message .message-header .message-close-button:active:hover, + .message .message-header .app-folder-dialog .message-close-button:active:hover, .app-folder-dialog .screenshot-ui-show-pointer-button:active:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #252525, 9%), 9%), 4%); } + .app-folder-dialog .icon-button:active:focus, .app-folder-dialog .login-dialog-button.cancel-button:active:focus, .app-folder-dialog .login-dialog-button.switch-user-button:active:focus, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active:focus, .app-folder-dialog .calendar .calendar-month-header .pager-button:active:focus, .calendar .calendar-month-header .app-folder-dialog .pager-button:active:focus, .app-folder-dialog .message .message-header .message-expand-button:active:focus, .message .message-header .app-folder-dialog .message-expand-button:active:focus, + .app-folder-dialog .message .message-header .message-close-button:active:focus, + .message .message-header .app-folder-dialog .message-close-button:active:focus, .app-folder-dialog .screenshot-ui-show-pointer-button:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #252525, 9%), 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #252525, 9%), 9%), #ffffff, 87%), 5%); } + .app-folder-dialog .page-indicators { + margin-bottom: 24px; } + .app-folder-dialog .page-navigation-arrow { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: #252525; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + .app-folder-dialog .page-navigation-arrow:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#252525, 7%), #ffffff, 87%); } + .app-folder-dialog .page-navigation-arrow:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#252525, 9%), #ffffff, 87%); } + .app-folder-dialog .page-navigation-arrow:active:hover { + background-color: st-lighten(st-lighten(#252525, 9%), 7%); } + .app-folder-dialog .page-navigation-arrow:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); } + .app-folder-dialog .overview-tile, .app-folder-dialog .grid-search-result { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: #252525; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; - border: none; } ++ border: none; ++ background-color: transparent; } + .app-folder-dialog .overview-tile:focus, .app-folder-dialog .grid-search-result:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, rgba(37, 37, 37, 0.25), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(37, 37, 37, 0.25), 5%); } + .app-folder-dialog .overview-tile:focus:hover, .app-folder-dialog .grid-search-result:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 7%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 7%), #ffffff, 87%), 5%); } + .app-folder-dialog .overview-tile:hover, .app-folder-dialog .grid-search-result:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#252525, 7%), #ffffff, 87%); } + .app-folder-dialog .overview-tile:active, .app-folder-dialog .grid-search-result:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#252525, 9%), #ffffff, 87%); } + .app-folder-dialog .overview-tile:active:hover, .app-folder-dialog .grid-search-result:active:hover { + background-color: st-lighten(st-lighten(#252525, 9%), 7%); } + .app-folder-dialog .overview-tile:active:focus, .app-folder-dialog .grid-search-result:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); } + .app-folder-dialog .overview-tile:highlighted, .app-folder-dialog .grid-search-result:highlighted, .app-folder-dialog .overview-tile:selected, .app-folder-dialog .grid-search-result:selected, .app-folder-dialog .overview-tile:checked, .app-folder-dialog .grid-search-result:checked { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#252525, 8%), #ffffff, 87%); } + .app-folder-dialog .overview-tile:highlighted:hover, .app-folder-dialog .grid-search-result:highlighted:hover, .app-folder-dialog .overview-tile:selected:hover, .app-folder-dialog .grid-search-result:selected:hover, .app-folder-dialog .overview-tile:checked:hover, .app-folder-dialog .grid-search-result:checked:hover { + background-color: st-lighten(st-lighten(#252525, 8%), 7%); } + .app-folder-dialog .overview-tile:highlighted:active, .app-folder-dialog .grid-search-result:highlighted:active, .app-folder-dialog .overview-tile:selected:active, .app-folder-dialog .grid-search-result:selected:active, .app-folder-dialog .overview-tile:checked:active, .app-folder-dialog .grid-search-result:checked:active { + background-color: st-lighten(st-lighten(#252525, 8%), 9%); } + .app-folder-dialog .overview-tile:insensitive, .app-folder-dialog .grid-search-result:insensitive { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: st-transparentize(#ffffff, 0.5); + background-color: #252525; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + .app-folder-dialog .overview-tile:drop, .app-folder-dialog .grid-search-result:drop { + background-color: st-transparentize(-st-accent-color, 0.8); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); } + +.rename-folder-popup .rename-folder-popup-item { + spacing: 6px; } + .rename-folder-popup .rename-folder-popup-item:ltr, .rename-folder-popup .rename-folder-popup-item:rtl { + padding: 0 12px; } + +.page-indicator { + padding: 6px 12px 0; + transition-duration: 400ms; } + .page-indicator .page-indicator-icon { + width: 10px; + height: 10px; + border-radius: 999px; + background-color: #ffffff; + transition-duration: 400ms; } + +.apps-scroll-view { + padding: 0; } + +.system-action-icon { + background-color: rgba(255, 255, 255, 0.1); + color: #ffffff; + border-radius: 999px; + icon-size: 48px; + box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.4); } + +.page-navigation-hint.dnd { + background: rgba(255, 255, 255, 0.1); } + +.page-navigation-hint.next:ltr, .page-navigation-hint.previous:rtl { + background-gradient-start: rgba(255, 255, 255, 0.05); + background-gradient-end: transparent; + background-gradient-direction: horizontal; + border-radius: 24px 0px 0px 24px; } + +.page-navigation-hint.previous:ltr, .page-navigation-hint.next:rtl { + background-gradient-start: transparent; + background-gradient-end: rgba(255, 255, 255, 0.05); + background-gradient-direction: horizontal; + border-radius: 0px 24px 24px 0px; } + +.page-navigation-arrow { + margin: 6px; + padding: 18px; + width: 24px; + height: 24px; + border-radius: 999px; + transition-duration: 100ms; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: #000000; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; } + .page-navigation-arrow > StIcon { + color: #ffffff; } + .page-navigation-arrow:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#000000, 7%), #ffffff, 87%); } + .page-navigation-arrow:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#000000, 9%), #ffffff, 87%); } + .page-navigation-arrow:active:hover { + background-color: st-lighten(st-lighten(#000000, 9%), 7%); } + .page-navigation-arrow:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); } + +/* Workspace pager */ +.workspace-thumbnails { + visible-width: 32px; + spacing: 6px; + padding: 6px; } + .workspace-thumbnails .workspace-thumbnail { + color: #ffffff; + background-color: #262626; + border-radius: 4px; + border: 1px solid transparent; + border-color: rgba(255, 255, 255, 0.4); } + .workspace-thumbnails .placeholder { + background-image: url("resource:///org/gnome/shell/theme/workspace-placeholder.svg"); + background-size: contain; + width: 18px; } + +.workspace-thumbnail-indicator { + border: 3px solid -st-accent-color; + border-radius: 8px; } + +.ripple-pointer-location { + width: 50px; + height: 50px; + border-radius: 25px; + background-color: st-lighten(st-transparentize(-st-accent-color, 0.7), 30%); + box-shadow: 0 0 2px 2px st-lighten(-st-accent-color, 20%); } + +.pie-timer { + width: 60px; + height: 60px; + -pie-border-width: 3px; + -pie-border-color: -st-accent-color; + -pie-background-color: st-lighten(st-transparentize(-st-accent-color, 0.7), 40%); } + +.magnifier-zoom-region { + border: 2px solid -st-accent-color; } + .magnifier-zoom-region.full-screen { + border-width: 0; } + +.select-area-rubberband { + background-color: st-transparentize(-st-accent-color, 0.7); + border: 1px solid -st-accent-color; } + +.user-icon { + background-size: contain; + border-radius: 999px; + icon-size: 64px; + background-color: rgba(255, 255, 255, 0.05); + color: #ffffff; } + .user-icon StIcon { + padding: 12px; } + .user-icon.user-avatar { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); } + +.lightbox { + background-color: black; } + +.flashspot { + background-color: white; } + +.hidden { + color: transparent; } + +.caps-lock-warning-label { + text-align: center; + padding-bottom: 8px; - color: #f6d32d; } ++ color: #cd9309; } + +/* Workspace animation */ +.workspace-animation { + background-color: #0d0d0d; } + +/* Tiled window previews */ +.tile-preview { + background-color: st-transparentize(-st-accent-color, 0.5); + border: 1px solid -st-accent-color; } + +/* On-screen Keyboard */ +#keyboard { + background-color: #000000; + box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.2); } + #keyboard .page-indicator { + padding: 6px; } + #keyboard .page-indicator .page-indicator-icon { + width: 8px; + height: 8px; } + +.key-container { + padding: 4px; + spacing: 4px; } + +.keyboard-key { + font-size: 1.455em; + font-weight: bold; - min-height: 1.2em; - min-width: 1.2em; - border-width: 1px; - border-style: solid; - border-radius: 10px; ++ border-radius: 0.546em; + box-shadow: 0 1px 0 0 transparent; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-mix(#ffffff, #4d4d4d, 9%), #ffffff, 87%); } + .keyboard-key:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); } + .keyboard-key:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); } + .keyboard-key:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 4%), #ffffff, 87%); } + .keyboard-key:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%); } + .keyboard-key:active:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 4%); } + .keyboard-key:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%), 5%); } + .keyboard-key:checked { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), #ffffff, 87%); } + .keyboard-key:checked:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 4%); } + .keyboard-key:checked:active { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 9%); } - .keyboard-key:grayed { - background-color: #121212; - color: #ffffff; - border-color: rgba(255, 255, 255, 0.2); } + .keyboard-key.default-key { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-mix(#ffffff, #333333, 9%), #ffffff, 87%); - border-radius: 10px; } ++ border: none; } + .keyboard-key.default-key:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #333333, 9%), 4%), #ffffff, 87%); } + .keyboard-key.default-key:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #333333, 9%), 9%), #ffffff, 87%); } + .keyboard-key.default-key:active:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #333333, 9%), 9%), 4%); } + .keyboard-key.default-key:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #333333, 9%), 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #333333, 9%), 9%), #ffffff, 87%), 5%); } + .keyboard-key.default-key:checked { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #333333, 9%), 8%), #ffffff, 87%); } + .keyboard-key.default-key:checked:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #333333, 9%), 8%), 4%); } + .keyboard-key.default-key:checked:active { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #333333, 9%), 8%), 9%); } + .keyboard-key.default-key:latched { - border-color: st-lighten(-st-accent-color, 5%); + background-color: -st-accent-color; } - .keyboard-key.enter-key { - box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); - color: -st-accent-fg-color; - background-color: st-mix(st-mix(-st-accent-fg-color, -st-accent-color, 9%), #ffffff, 87%); - border-radius: 10px; - color: #ffffff; } - .keyboard-key.enter-key:hover { - box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); - color: -st-accent-fg-color; - background-color: st-mix(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 4%), #ffffff, 87%); } - .keyboard-key.enter-key:active { - box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); - color: -st-accent-fg-color; - background-color: st-mix(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 9%), #ffffff, 87%); } - .keyboard-key.enter-key:active:hover { - background-color: st-lighten(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 9%), 4%); } - .keyboard-key.enter-key:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 9%), #ffffff, 87%), 5%); } - .keyboard-key.enter-key:checked { - box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); - color: -st-accent-fg-color; - background-color: st-mix(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 8%), #ffffff, 87%); } - .keyboard-key.enter-key:checked:hover { - background-color: st-lighten(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 8%), 4%); } - .keyboard-key.enter-key:checked:active { - background-color: st-lighten(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 8%), 9%); } - .keyboard-key.shift-key-uppercase { - background-color: gray; - color: #000000; } - .keyboard-key.shift-key-uppercase:hover { - background-color: #8c8c8c; - color: #0d0d0d; } + .keyboard-key StIcon { - icon-size: 24px; } ++ icon-size: 1.6365em; } + - .keyboard-subkeys { - -arrow-border-radius: 16px; ++.keyboard-subkeys-boxpointer { ++ -arrow-border-radius: 22px; + -arrow-background-color: #000000; + -arrow-border-width: 1px; + -arrow-border-color: #171717; + -arrow-base: 20px; + -arrow-rise: 10px; - -boxpointer-gap: 6px; - padding: 6px; } - .keyboard-subkeys .keyboard-key { - box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); - color: #ffffff; - background-color: st-mix(st-mix(#ffffff, #4d4d4d, 9%), #ffffff, 87%); - border-radius: 10px; } - .keyboard-subkeys .keyboard-key:focus { - box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); - color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); } - .keyboard-subkeys .keyboard-key:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); } - .keyboard-subkeys .keyboard-key:hover { - box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); - color: #ffffff; - background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 4%), #ffffff, 87%); } - .keyboard-subkeys .keyboard-key:active { - box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); - color: #ffffff; - background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%); } - .keyboard-subkeys .keyboard-key:active:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 4%); } - .keyboard-subkeys .keyboard-key:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%), 5%); } - .keyboard-subkeys .keyboard-key:checked { - box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); - color: #ffffff; - background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), #ffffff, 87%); } - .keyboard-subkeys .keyboard-key:checked:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 4%); } - .keyboard-subkeys .keyboard-key:checked:active { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 9%); } ++ -boxpointer-gap: 4px; ++ border-radius: 22px; ++ box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.1); } ++ .keyboard-subkeys-boxpointer .key-container { ++ padding: 12px; ++ spacing: 8px; } + +.emoji-page .keyboard-key { + background-color: transparent; + border: none; + color: initial; } + +.emoji-panel .keyboard-key:latched { + border-color: st-lighten(-st-accent-color, 5%); + background-color: -st-accent-color; } + +.word-suggestions { + spacing: 12px; + min-height: 17pt; + padding: 12px; + color: #ffffff; } + .word-suggestions StButton { + margin: 0 3px; + min-width: 32px; + border-radius: 4px; - padding: 0px 18px; ++ padding: 6px 18px; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + background-color: transparent; + border-color: transparent; + box-shadow: none; } + .word-suggestions StButton:insensitive { + background-color: transparent !important; } + .word-suggestions StButton:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); } + .word-suggestions StButton:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); } + .word-suggestions StButton:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 4%), #ffffff, 87%); } + .word-suggestions StButton:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%); } + .word-suggestions StButton:active:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 4%); } + .word-suggestions StButton:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%), 5%); } + .word-suggestions StButton:checked { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), #ffffff, 87%); } + .word-suggestions StButton:checked:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 4%); } + .word-suggestions StButton:checked:active { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 9%); } + +/* Looking Glass */ +.lg-dialog StEntry { + min-height: 1.5em; } + +.lg-dialog .shell-link { + color: st-lighten(-st-accent-color, 20%); } + .lg-dialog .shell-link:hover { + color: st-lighten(st-lighten(-st-accent-color, 20%), 10%); } + .lg-dialog .shell-link:active { + color: st-darken(st-lighten(-st-accent-color, 20%), 10%); } + +.lg-dialog .actor-link { + color: st-darken(#ffffff, 20%); } + .lg-dialog .actor-link:hover { + color: #ffffff; } + .lg-dialog .actor-link:active { + color: st-lighten(#ffffff, 20%); } + .lg-dialog .actor-link StIcon { + icon-size: 12px; } + +.lg-completions-text { + font-style: italic; } + +#LookingGlassDialog { + background-color: rgba(0, 0, 0, 0.98); + color: #ffffff; + border-radius: 16px; + margin-top: 4px; + border: 2px solid transparent; + padding: 6px; + spacing: 6px; + box-shadow: 0 2px 4px 0 transparent; + border-color: rgba(255, 255, 255, 0.4); + background-color: #000000; + box-shadow: none; } + #LookingGlassDialog > #Toolbar { + border: none; + padding: 6px; + border-radius: 0; + background-color: transparent; + spacing: 6px; } + #LookingGlassDialog > #Toolbar .lg-toolbar-button { + padding: 6px 12px; } + #LookingGlassDialog > #Toolbar .lg-toolbar-button > StIcon { + icon-size: 16px; } + #LookingGlassDialog .labels { + spacing: 6px; } + #LookingGlassDialog .notebook-tab { + background-color: transparent; + -natural-hpadding: 12px; + -minimum-hpadding: 12px; + padding: 6px 12px; } + #LookingGlassDialog .notebook-tab:selected { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%); } + #LookingGlassDialog .notebook-tab:selected:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), 4%); } + #LookingGlassDialog .notebook-tab:selected:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); } + +#LookingGlassPropertyInspector { + background-color: #000000; + color: #ffffff; + border-radius: 16px; + border: 1px solid rgba(255, 255, 255, 0.2); + padding: 12px; + border-color: rgba(255, 255, 255, 0.4); } + #LookingGlassPropertyInspector .lg-obj-inspector-title { + spacing: 4px; } + #LookingGlassPropertyInspector .lg-obj-inspector-close-button, + #LookingGlassPropertyInspector .lg-obj-inspector-button { + padding: 6px 12px; } + #LookingGlassPropertyInspector .lg-obj-inspector-close-button { + margin: 4px; + padding: 6px; + border-radius: 999px; } + #LookingGlassPropertyInspector .lg-obj-inspector-close-button > StIcon { + icon-size: 16px; } + +#LookingGlassEvaluator { + padding: 6px; } + #LookingGlassEvaluator .evaluator-results { + spacing: 6px; } + +#LookingGlassWindows { + padding: 6px; + spacing: 6px; } + #LookingGlassWindows .lg-window { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%); + margin: 0; + padding: 12px; } + +#LookingGlassExtensions .lg-extensions-list { + padding: 6px; + spacing: 6px; } + +#LookingGlassExtensions .lg-extension { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%); + margin: 0; + spacing: 4px; + padding: 12px; } + #LookingGlassExtensions .lg-extension .lg-extension-name { + color: #ffffff !important; } + #LookingGlassExtensions .lg-extension .lg-extension-meta { + spacing: 12px; } + +#LookingGlassExtensions .lg-extensions-none { + color: rgba(255, 255, 255, 0.5); } + +#LookingGlassActors { + padding: 6px; + spacing: 4px; } + +#LookingGlassDebugFlags .lg-debug-flags-header { + padding: 6px; + padding-top: 12px; } + +#LookingGlassDebugFlags .lg-debug-flag-button { + padding: 9px 12px; + margin-bottom: 6px; } + #LookingGlassDebugFlags .lg-debug-flag-button StLabel { + font-weight: normal !important; } + #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch { + background: rgba(255, 255, 255, 0.3); } + #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:hover { + background: rgba(255, 255, 255, 0.4); } + #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:checked { + background: -st-accent-color; + color: -st-accent-fg-color; } + #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:checked:hover { + background-color: st-lighten(-st-accent-color, 5%); + color: st-lighten(-st-accent-fg-color, 5%); } + +.login-dialog, +.unlock-dialog { + color: #ffffff; } + .login-dialog .caps-lock-warning-label, + .login-dialog .login-dialog-message-warning, + .unlock-dialog .caps-lock-warning-label, + .unlock-dialog .login-dialog-message-warning { + color: #ffffff; } + .login-dialog .login-dialog-prompt-layout, + .unlock-dialog .login-dialog-prompt-layout { + width: 25em; + spacing: 9px; } + +.login-dialog-button.cancel-button { + padding: 9px; } + +.login-dialog-button-box { + spacing: 12px; } + +.conflicting-session-dialog-content { + spacing: 20px; } + .conflicting-session-dialog-content .conflicting-session-dialog-title { + text-align: center; + margin-bottom: 5px; } + .conflicting-session-dialog-content .conflicting-session-dialog-desc { + text-align: center; } + .conflicting-session-dialog-content .conflicting-session-dialog-desc-warning { + text-align: center; - color: #f6d32d; } ++ color: #cd9309; } + +.login-dialog-logo-bin { + margin: 3em 0; } + +.login-dialog-banner-view { + max-width: 25em; } + .login-dialog-banner-view .login-dialog-banner { + color: #e6e6e6; } + +.login-dialog-message { + text-align: center; } + +.login-dialog-message-hint, .login-dialog-message { + color: #e6e6e6; + min-height: 2.75em; } + +.login-dialog-user-selection-box { + padding-top: 4em; + padding-bottom: 8em; } + +.login-dialog-not-listed-label { + padding: 6px; } + +.login-dialog-not-listed-button { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: #000000; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + box-shadow: none; + border: none; + padding: 0 6px; + margin: 6px; } + .login-dialog-not-listed-button:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, rgba(0, 0, 0, 0.25), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(0, 0, 0, 0.25), 5%); } + .login-dialog-not-listed-button:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); } + .login-dialog-not-listed-button:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#000000, 7%), #ffffff, 87%); } + .login-dialog-not-listed-button:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(#000000, 9%), #ffffff, 87%); } + .login-dialog-not-listed-button:active:hover { + background-color: st-lighten(st-lighten(#000000, 9%), 7%); } + .login-dialog-not-listed-button:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); } + +.login-dialog-auth-list-view { + -st-vfade-offset: 3em; } + +.login-dialog-auth-list { + spacing: 6px; + margin-left: 2em; } + +.login-dialog-auth-list-title { + margin-left: 2em; } + +.login-dialog-auth-list-item { + border-radius: 16px; + padding: 4px; + color: #b3b3b3; } + .login-dialog-auth-list-item:focus, .login-dialog-auth-list-item:selected { + background-color: -st-accent-color; + color: -st-accent-fg-color; } + +.login-dialog-auth-list-label:ltr { + padding-left: 15px; + text-align: left; } + +.login-dialog-auth-list-label:rtl { + padding-right: 15px; + text-align: right; } + +.login-dialog-user-list-view { + width: 25em; + -st-vfade-offset: 3em; } + .login-dialog-user-list-view .login-dialog-user-list { + margin: 0 8px; + spacing: 12px; } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%); + border-radius: 16px; + padding: 9px; } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:selected, .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:focus { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; - background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important; ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%), 5%); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:selected:hover, .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:focus:hover { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%), 5%); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:hover { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active { + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); + color: #ffffff; + background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active:hover { + background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), 4%); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active:focus { - background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); } ++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item .user-icon { + border: 2px solid transparent; } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item .login-dialog-timed-login-indicator { + height: 2px; + margin-top: 6px; + background-color: rgba(255, 255, 255, 0.7); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:logged-in .user-icon { + border-color: -st-accent-color; } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:logged-in .user-icon StIcon { + background-color: st-transparentize(-st-accent-color, 0.7); } + +.unlock-dialog { + background-color: transparent; } + +.screen-shield-background { + background: black; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.6); } + +#lockDialogGroup { + background-color: #000000; } + +.unlock-dialog-clock { + color: #ffffff; + spacing: 2em; } + .unlock-dialog-clock .unlock-dialog-clock-time { + font-size: 6.546em; + font-weight: 800; } + .unlock-dialog-clock .unlock-dialog-clock-date { + font-weight: 400; } + .unlock-dialog-clock .unlock-dialog-clock-hint { + margin-top: 2em; + padding: 6px 18px; + border-radius: 16px; + font-weight: bold; } + +#unlockDialogNotifications StButton#vhandle, #unlockDialogNotifications StButton#hhandle { + background-color: rgba(26, 26, 26, 0.3); } + #unlockDialogNotifications StButton#vhandle:hover, #unlockDialogNotifications StButton#vhandle:focus, #unlockDialogNotifications StButton#hhandle:hover, #unlockDialogNotifications StButton#hhandle:focus { + background-color: rgba(26, 26, 26, 0.5); } + #unlockDialogNotifications StButton#vhandle:active, #unlockDialogNotifications StButton#hhandle:active { + background-color: st-transparentize(-st-accent-color, 0.5); } + +.unlock-dialog-notifications-container { + margin: 12px; + spacing: 6px; + width: 25em; + background-color: transparent; } + .unlock-dialog-notifications-container .summary-notification-stack-scrollview { + padding-top: 0; + padding-bottom: 0; } + .unlock-dialog-notifications-container .notification, + .unlock-dialog-notifications-container .unlock-dialog-notification-source { + padding: 12px 16px; + border: none; + background-color: rgba(255, 255, 255, 0.1); + color: #ffffff; + border-radius: 16px; } + .unlock-dialog-notifications-container .notification.critical, + .unlock-dialog-notifications-container .unlock-dialog-notification-source.critical { + background-color: rgba(255, 255, 255, 0.2); } + +.unlock-dialog-notification-icon { + icon-size: 32px; } + +.unlock-dialog-notification-label { + padding-left: 12px; + padding-right: 0; } + .unlock-dialog-notification-label:rtl { + padding-right: 12px; + padding-left: 0; } + +.unlock-dialog-notification-count-text { + font-weight: bold; + padding: 0 12px; + color: #ffffff; + background-color: rgba(255, 255, 255, 0.1); + border-radius: 999px; } + +.login-dialog .user-widget .user-widget-label, +.unlock-dialog .user-widget .user-widget-label { + color: #ffffff; } + +.login-dialog .user-widget .user-icon, +.unlock-dialog .user-widget .user-icon { + background-color: rgba(255, 255, 255, 0.13); + color: #ffffff; + background-color: rgba(255, 255, 255, 0.3); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); } + +.login-dialog .user-widget.horizontal, +.unlock-dialog .user-widget.horizontal { + spacing: 18px; } + +.login-dialog .user-widget.vertical, +.unlock-dialog .user-widget.vertical { + spacing: 24px; } + .login-dialog .user-widget.vertical .user-widget-label, + .unlock-dialog .user-widget.vertical .user-widget-label { + font-weight: 400; + font-size: 1.818em; + text-align: center; + margin-bottom: .75em; } + .login-dialog .user-widget.vertical .user-icon, + .unlock-dialog .user-widget.vertical .user-icon { + icon-size: 160px; } + .login-dialog .user-widget.vertical .user-icon StIcon, + .unlock-dialog .user-widget.vertical .user-icon StIcon { + padding: 30px; } diff --cc data/theme/gnome-shell-light.css index 4d522ba7c,000000000..0fd5045ab mode 100644,000000..100644 --- a/data/theme/gnome-shell-light.css +++ b/data/theme/gnome-shell-light.css @@@ -1,3236 -1,0 +1,3206 @@@ +/* This stylesheet is generated, DO NOT EDIT */ +/* Copyright 2009, 2015 Red Hat, Inc. + * + * Portions adapted from Mx's data/style/default.css + * Copyright 2009 Intel Corporation + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU Lesser General Public License, + * version 2.1, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for + * more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* Global Values */ +stage { + font-size: 1em; - color: #282828; } ++ color: #222226; } + +/* Common Stylings */ +#dash .dash-item-container .show-apps, +#dash .dash-item-container .overview-tile, +#dash .dash-item-container .grid-search-result { + background: none; + box-shadow: none; + border: none; + border-radius: 0; + padding: 0; + margin: 0; } + +.app-folder-dialog .overview-tile, .app-folder-dialog .grid-search-result, .app-folder, .overview-tile, .grid-search-result, #dash .dash-item-container .show-apps .overview-icon, +#dash .dash-item-container .overview-tile .overview-icon, +#dash .dash-item-container .grid-search-result .overview-icon, .list-search-result, .search-provider-icon, .switcher-list .item-box, .audio-device-selection-dialog .audio-selection-box .audio-selection-device { + border-radius: 16px; + padding: 6px; + spacing: 6px; + text-align: center; + transition-duration: 100ms; } + +.login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item, .login-dialog-not-listed-button, .unlock-dialog .button, +.unlock-dialog .icon-button, +.unlock-dialog .message .message-header .message-expand-button, +.message .message-header .unlock-dialog .message-expand-button, +.unlock-dialog .message .message-header .message-close-button, +.message .message-header .unlock-dialog .message-close-button, +.unlock-dialog .screenshot-ui-show-pointer-button, #LookingGlassDialog .notebook-tab, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button, #LookingGlassDebugFlags .lg-debug-flag-button, #LookingGlassPropertyInspector .lg-obj-inspector-close-button, +#LookingGlassPropertyInspector .lg-obj-inspector-button, #LookingGlassDialog > #Toolbar .lg-toolbar-button, .icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .message .message-header .message-expand-button, +.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button, .button { + border-radius: 8px; + padding: 3px 24px; + font-weight: bold; + transition: border-width 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94), box-shadow 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94); } + +.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .screenshot-ui-show-pointer-button, .message .message-header .message-expand-button, +.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button, .button { - color: #282828; - background-color: st-mix(#282828, whitesmoke, 12%); } ++ color: #222226; ++ background-color: st-mix(#222226, #fafafb, 12%); } + .icon-button:focus, .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus, .screenshot-ui-show-pointer-button:focus, .message .message-header .message-expand-button:focus, + .message .message-header .message-close-button:focus, .calendar .calendar-month-header .pager-button:focus, .button:focus { - color: #282828; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, st-mix(#282828, whitesmoke, 12%), 5%); } ++ color: #222226; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, st-mix(#222226, #fafafb, 12%), 5%); } + .icon-button:focus:hover, .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .message .message-header .message-expand-button:focus:hover, + .message .message-header .message-close-button:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .button:focus:hover { - background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, whitesmoke, 12%), 4%), 5%); } ++ background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #fafafb, 12%), 4%), 5%); } + .icon-button:hover, .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover, .screenshot-ui-show-pointer-button:hover, .message .message-header .message-expand-button:hover, + .message .message-header .message-close-button:hover, .calendar .calendar-month-header .pager-button:hover, .button:hover { - color: #282828; - background-color: st-darken(st-mix(#282828, whitesmoke, 12%), 4%); } ++ color: #222226; ++ background-color: st-darken(st-mix(#222226, #fafafb, 12%), 4%); } + .icon-button:insensitive, .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive, .screenshot-ui-show-pointer-button:insensitive, .message .message-header .message-expand-button:insensitive, + .message .message-header .message-close-button:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .button:insensitive { - color: st-transparentize(#282828, 0.6); - background-color: st-lighten(st-mix(#282828, whitesmoke, 12%), 3%); } ++ color: st-transparentize(#222226, 0.6); ++ background-color: st-lighten(st-mix(#222226, #fafafb, 12%), 3%); } + .icon-button:selected, .login-dialog-button.cancel-button:selected, .login-dialog-button.switch-user-button:selected, .login-dialog-button.login-dialog-session-list-button:selected, .screenshot-ui-show-pointer-button:selected, .message .message-header .message-expand-button:selected, + .message .message-header .message-close-button:selected, .calendar .calendar-month-header .pager-button:selected, .button:selected, .icon-button:active, .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active, .screenshot-ui-show-pointer-button:active, .message .message-header .message-expand-button:active, + .message .message-header .message-close-button:active, .calendar .calendar-month-header .pager-button:active, .button:active { - color: #282828; - background-color: st-darken(st-mix(#282828, whitesmoke, 12%), 9%); } ++ color: #222226; ++ background-color: st-darken(st-mix(#222226, #fafafb, 12%), 9%); } + .icon-button:selected:hover, .login-dialog-button.cancel-button:selected:hover, .login-dialog-button.switch-user-button:selected:hover, .login-dialog-button.login-dialog-session-list-button:selected:hover, .screenshot-ui-show-pointer-button:selected:hover, .message .message-header .message-expand-button:selected:hover, + .message .message-header .message-close-button:selected:hover, .calendar .calendar-month-header .pager-button:selected:hover, .button:selected:hover, .icon-button:active:hover, .login-dialog-button.cancel-button:active:hover, .login-dialog-button.switch-user-button:active:hover, .login-dialog-button.login-dialog-session-list-button:active:hover, .screenshot-ui-show-pointer-button:active:hover, .message .message-header .message-expand-button:active:hover, + .message .message-header .message-close-button:active:hover, .calendar .calendar-month-header .pager-button:active:hover, .button:active:hover { - background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 9%), 4%); } ++ background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 9%), 4%); } + .icon-button:selected:focus, .login-dialog-button.cancel-button:selected:focus, .login-dialog-button.switch-user-button:selected:focus, .login-dialog-button.login-dialog-session-list-button:selected:focus, .screenshot-ui-show-pointer-button:selected:focus, .message .message-header .message-expand-button:selected:focus, + .message .message-header .message-close-button:selected:focus, .calendar .calendar-month-header .pager-button:selected:focus, .button:selected:focus, .icon-button:active:focus, .login-dialog-button.cancel-button:active:focus, .login-dialog-button.switch-user-button:active:focus, .login-dialog-button.login-dialog-session-list-button:active:focus, .screenshot-ui-show-pointer-button:active:focus, .message .message-header .message-expand-button:active:focus, + .message .message-header .message-close-button:active:focus, .calendar .calendar-month-header .pager-button:active:focus, .button:active:focus { - background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, whitesmoke, 12%), 9%), 5%); } ++ background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #fafafb, 12%), 9%), 5%); } + .icon-button:checked, .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked, .screenshot-ui-show-pointer-button:checked, .message .message-header .message-expand-button:checked, + .message .message-header .message-close-button:checked, .calendar .calendar-month-header .pager-button:checked, .button:checked { - color: #282828; - background-color: st-darken(st-mix(#282828, whitesmoke, 12%), 8%); } ++ color: #222226; ++ background-color: st-darken(st-mix(#222226, #fafafb, 12%), 8%); } + .icon-button:checked:hover, .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .message .message-header .message-expand-button:checked:hover, + .message .message-header .message-close-button:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .button:checked:hover { - background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 8%), 4%); } ++ background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 8%), 4%); } + .icon-button:checked:active, .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active, .screenshot-ui-show-pointer-button:checked:active, .message .message-header .message-expand-button:checked:active, + .message .message-header .message-close-button:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .button:checked:active { - background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 8%), 9%); } ++ background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 8%), 9%); } + +.calendar .calendar-day-heading, .calendar .calendar-day, .calendar .calendar-month-header .calendar-month-label, .icon-button.flat, .flat.login-dialog-button.cancel-button, .flat.login-dialog-button.switch-user-button, .flat.login-dialog-button.login-dialog-session-list-button, .flat.screenshot-ui-show-pointer-button, .message .message-header .flat.message-expand-button, +.message .message-header .flat.message-close-button, .calendar .calendar-month-header .pager-button, .button.flat { - color: #282828; - background-color: whitesmoke; } ++ color: #222226; ++ background-color: #fafafb; } + .calendar .calendar-day-heading:focus, .calendar .calendar-day:focus, .calendar .calendar-month-header .calendar-month-label:focus, .icon-button.flat:focus, .flat.login-dialog-button.cancel-button:focus, .flat.login-dialog-button.switch-user-button:focus, .flat.login-dialog-button.login-dialog-session-list-button:focus, .flat.screenshot-ui-show-pointer-button:focus, .message .message-header .flat.message-expand-button:focus, + .message .message-header .flat.message-close-button:focus, .calendar .calendar-month-header .pager-button:focus, .button.flat:focus { - color: #282828; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.25), 5%); } ++ color: #222226; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, rgba(250, 250, 251, 0.25), 5%); } + .calendar .calendar-day-heading:focus:hover, .calendar .calendar-day:focus:hover, .calendar .calendar-month-header .calendar-month-label:focus:hover, .icon-button.flat:focus:hover, .flat.login-dialog-button.cancel-button:focus:hover, .flat.login-dialog-button.switch-user-button:focus:hover, .flat.login-dialog-button.login-dialog-session-list-button:focus:hover, .flat.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .flat.message-expand-button:focus:hover, + .message .message-header .flat.message-close-button:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .button.flat:focus:hover { - background-color: st-mix(-st-accent-color, st-darken(whitesmoke, 7%), 5%); } ++ background-color: st-mix(-st-accent-color, st-darken(#fafafb, 7%), 5%); } + .calendar .calendar-day-heading:hover, .calendar .calendar-day:hover, .calendar .calendar-month-header .calendar-month-label:hover, .icon-button.flat:hover, .flat.login-dialog-button.cancel-button:hover, .flat.login-dialog-button.switch-user-button:hover, .flat.login-dialog-button.login-dialog-session-list-button:hover, .flat.screenshot-ui-show-pointer-button:hover, .message .message-header .flat.message-expand-button:hover, + .message .message-header .flat.message-close-button:hover, .calendar .calendar-month-header .pager-button:hover, .button.flat:hover { - color: #282828; - background-color: st-darken(whitesmoke, 7%); } ++ color: #222226; ++ background-color: st-darken(#fafafb, 7%); } + .calendar .calendar-day-heading:insensitive, .calendar .calendar-day:insensitive, .calendar .calendar-month-header .calendar-month-label:insensitive, .icon-button.flat:insensitive, .flat.login-dialog-button.cancel-button:insensitive, .flat.login-dialog-button.switch-user-button:insensitive, .flat.login-dialog-button.login-dialog-session-list-button:insensitive, .flat.screenshot-ui-show-pointer-button:insensitive, .message .message-header .flat.message-expand-button:insensitive, + .message .message-header .flat.message-close-button:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .button.flat:insensitive { - color: st-transparentize(#282828, 0.6); - background-color: whitesmoke; } ++ color: st-transparentize(#222226, 0.6); ++ background-color: #fafafb; } + .calendar .calendar-day-heading:selected, .calendar .calendar-day:selected, .calendar .calendar-month-header .calendar-month-label:selected, .icon-button.flat:selected, .flat.login-dialog-button.cancel-button:selected, .flat.login-dialog-button.switch-user-button:selected, .flat.login-dialog-button.login-dialog-session-list-button:selected, .flat.screenshot-ui-show-pointer-button:selected, .message .message-header .flat.message-expand-button:selected, + .message .message-header .flat.message-close-button:selected, .calendar .calendar-month-header .pager-button:selected, .button.flat:selected, .calendar .calendar-day-heading:active, .calendar .calendar-day:active, .calendar .calendar-month-header .calendar-month-label:active, .icon-button.flat:active, .flat.login-dialog-button.cancel-button:active, .flat.login-dialog-button.switch-user-button:active, .flat.login-dialog-button.login-dialog-session-list-button:active, .flat.screenshot-ui-show-pointer-button:active, .message .message-header .flat.message-expand-button:active, + .message .message-header .flat.message-close-button:active, .calendar .calendar-month-header .pager-button:active, .button.flat:active { - color: #282828; - background-color: st-darken(whitesmoke, 9%); } ++ color: #222226; ++ background-color: st-darken(#fafafb, 9%); } + .calendar .calendar-day-heading:selected:hover, .calendar .calendar-day:selected:hover, .calendar .calendar-month-header .calendar-month-label:selected:hover, .icon-button.flat:selected:hover, .flat.login-dialog-button.cancel-button:selected:hover, .flat.login-dialog-button.switch-user-button:selected:hover, .flat.login-dialog-button.login-dialog-session-list-button:selected:hover, .flat.screenshot-ui-show-pointer-button:selected:hover, .message .message-header .flat.message-expand-button:selected:hover, + .message .message-header .flat.message-close-button:selected:hover, .calendar .calendar-month-header .pager-button:selected:hover, .button.flat:selected:hover, .calendar .calendar-day-heading:active:hover, .calendar .calendar-day:active:hover, .calendar .calendar-month-header .calendar-month-label:active:hover, .icon-button.flat:active:hover, .flat.login-dialog-button.cancel-button:active:hover, .flat.login-dialog-button.switch-user-button:active:hover, .flat.login-dialog-button.login-dialog-session-list-button:active:hover, .flat.screenshot-ui-show-pointer-button:active:hover, .message .message-header .flat.message-expand-button:active:hover, + .message .message-header .flat.message-close-button:active:hover, .calendar .calendar-month-header .pager-button:active:hover, .button.flat:active:hover { - background-color: st-darken(st-darken(whitesmoke, 9%), 7%); } ++ background-color: st-darken(st-darken(#fafafb, 9%), 7%); } + .calendar .calendar-day-heading:selected:focus, .calendar .calendar-day:selected:focus, .calendar .calendar-month-header .calendar-month-label:selected:focus, .icon-button.flat:selected:focus, .flat.login-dialog-button.cancel-button:selected:focus, .flat.login-dialog-button.switch-user-button:selected:focus, .flat.login-dialog-button.login-dialog-session-list-button:selected:focus, .flat.screenshot-ui-show-pointer-button:selected:focus, .message .message-header .flat.message-expand-button:selected:focus, + .message .message-header .flat.message-close-button:selected:focus, .calendar .calendar-month-header .pager-button:selected:focus, .button.flat:selected:focus, .calendar .calendar-day-heading:active:focus, .calendar .calendar-day:active:focus, .calendar .calendar-month-header .calendar-month-label:active:focus, .icon-button.flat:active:focus, .flat.login-dialog-button.cancel-button:active:focus, .flat.login-dialog-button.switch-user-button:active:focus, .flat.login-dialog-button.login-dialog-session-list-button:active:focus, .flat.screenshot-ui-show-pointer-button:active:focus, .message .message-header .flat.message-expand-button:active:focus, + .message .message-header .flat.message-close-button:active:focus, .calendar .calendar-month-header .pager-button:active:focus, .button.flat:active:focus { - background-color: st-mix(-st-accent-color, st-darken(whitesmoke, 9%), 5%); } ++ background-color: st-mix(-st-accent-color, st-darken(#fafafb, 9%), 5%); } + .calendar .calendar-day-heading:checked, .calendar .calendar-day:checked, .calendar .calendar-month-header .calendar-month-label:checked, .icon-button.flat:checked, .flat.login-dialog-button.cancel-button:checked, .flat.login-dialog-button.switch-user-button:checked, .flat.login-dialog-button.login-dialog-session-list-button:checked, .flat.screenshot-ui-show-pointer-button:checked, .message .message-header .flat.message-expand-button:checked, + .message .message-header .flat.message-close-button:checked, .calendar .calendar-month-header .pager-button:checked, .button.flat:checked { - color: #282828; - background-color: st-darken(whitesmoke, 8%); } ++ color: #222226; ++ background-color: st-darken(#fafafb, 8%); } + .calendar .calendar-day-heading:checked:hover, .calendar .calendar-day:checked:hover, .calendar .calendar-month-header .calendar-month-label:checked:hover, .icon-button.flat:checked:hover, .flat.login-dialog-button.cancel-button:checked:hover, .flat.login-dialog-button.switch-user-button:checked:hover, .flat.login-dialog-button.login-dialog-session-list-button:checked:hover, .flat.screenshot-ui-show-pointer-button:checked:hover, .message .message-header .flat.message-expand-button:checked:hover, + .message .message-header .flat.message-close-button:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .button.flat:checked:hover { - background-color: st-darken(st-darken(whitesmoke, 8%), 7%); } ++ background-color: st-darken(st-darken(#fafafb, 8%), 7%); } + .calendar .calendar-day-heading:checked:active, .calendar .calendar-day:checked:active, .calendar .calendar-month-header .calendar-month-label:checked:active, .icon-button.flat:checked:active, .flat.login-dialog-button.cancel-button:checked:active, .flat.login-dialog-button.switch-user-button:checked:active, .flat.login-dialog-button.login-dialog-session-list-button:checked:active, .flat.screenshot-ui-show-pointer-button:checked:active, .message .message-header .flat.message-expand-button:checked:active, + .message .message-header .flat.message-close-button:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .button.flat:checked:active { - background-color: st-darken(st-darken(whitesmoke, 8%), 9%); } ++ background-color: st-darken(st-darken(#fafafb, 8%), 9%); } + - .keyboard-brightness-level .button:checked, .quick-menu-toggle .quick-toggle-arrow:checked, .quick-toggle:checked, .calendar .calendar-day.calendar-today, .icon-button.default, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .default.screenshot-ui-show-pointer-button, .message .message-header .default.message-expand-button, ++.keyboard-brightness-level .button:checked, .quick-toggle:checked, .calendar .calendar-day.calendar-today, .icon-button.default, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .default.screenshot-ui-show-pointer-button, .message .message-header .default.message-expand-button, +.message .message-header .default.message-close-button, .calendar .calendar-month-header .default.pager-button, .button.default { + color: -st-accent-fg-color; + background-color: -st-accent-color; } - .keyboard-brightness-level .button:focus:checked, .quick-menu-toggle .quick-toggle-arrow:focus:checked, .quick-toggle:focus:checked, .calendar .calendar-day.calendar-today:focus, .icon-button.default:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .default.screenshot-ui-show-pointer-button:focus, .message .message-header .default.message-expand-button:focus, ++ .keyboard-brightness-level .button:focus:checked, .quick-toggle:focus:checked, .calendar .calendar-day.calendar-today:focus, .icon-button.default:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .default.screenshot-ui-show-pointer-button:focus, .message .message-header .default.message-expand-button:focus, + .message .message-header .default.message-close-button:focus, .calendar .calendar-month-header .default.pager-button:focus, .button.default:focus { + color: -st-accent-fg-color; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - box-shadow: inset 0 0 0 2px st-darken(-st-accent-color, 15%) !important; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ box-shadow: inset 0 0 0 2px st-transparentize(st-darken(-st-accent-color, 20%), 0.2) !important; + background-color: st-mix(-st-accent-color, -st-accent-color, 5%); } - .keyboard-brightness-level .button:focus:hover:checked, .quick-menu-toggle .quick-toggle-arrow:focus:hover:checked, .quick-toggle:focus:hover:checked, .calendar .calendar-day.calendar-today:focus:hover, .icon-button.default:focus:hover, .default.login-dialog-button.cancel-button:focus:hover, .default.login-dialog-button.switch-user-button:focus:hover, .default.login-dialog-button.login-dialog-session-list-button:focus:hover, .default.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .default.message-expand-button:focus:hover, ++ .keyboard-brightness-level .button:focus:hover:checked, .quick-toggle:focus:hover:checked, .calendar .calendar-day.calendar-today:focus:hover, .icon-button.default:focus:hover, .default.login-dialog-button.cancel-button:focus:hover, .default.login-dialog-button.switch-user-button:focus:hover, .default.login-dialog-button.login-dialog-session-list-button:focus:hover, .default.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .default.message-expand-button:focus:hover, + .message .message-header .default.message-close-button:focus:hover, .calendar .calendar-month-header .default.pager-button:focus:hover, .button.default:focus:hover { + background-color: st-mix(-st-accent-color, st-darken(-st-accent-color, 4%), 5%); } - .keyboard-brightness-level .button:hover:checked, .quick-menu-toggle .quick-toggle-arrow:hover:checked, .quick-toggle:hover:checked, .calendar .calendar-day.calendar-today:hover, .icon-button.default:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .default.screenshot-ui-show-pointer-button:hover, .message .message-header .default.message-expand-button:hover, ++ .keyboard-brightness-level .button:hover:checked, .quick-toggle:hover:checked, .calendar .calendar-day.calendar-today:hover, .icon-button.default:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .default.screenshot-ui-show-pointer-button:hover, .message .message-header .default.message-expand-button:hover, + .message .message-header .default.message-close-button:hover, .calendar .calendar-month-header .default.pager-button:hover, .button.default:hover { + color: -st-accent-fg-color; + background-color: st-darken(-st-accent-color, 4%); } - .keyboard-brightness-level .button:insensitive:checked, .quick-menu-toggle .quick-toggle-arrow:insensitive:checked, .quick-toggle:insensitive:checked, .calendar .calendar-day.calendar-today:insensitive, .icon-button.default:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .default.screenshot-ui-show-pointer-button:insensitive, .message .message-header .default.message-expand-button:insensitive, ++ .keyboard-brightness-level .button:insensitive:checked, .quick-toggle:insensitive:checked, .calendar .calendar-day.calendar-today:insensitive, .icon-button.default:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .default.screenshot-ui-show-pointer-button:insensitive, .message .message-header .default.message-expand-button:insensitive, + .message .message-header .default.message-close-button:insensitive, .calendar .calendar-month-header .default.pager-button:insensitive, .button.default:insensitive { + color: st-transparentize(-st-accent-fg-color, 0.6); + background-color: st-lighten(-st-accent-color, 3%); } - .keyboard-brightness-level .button:active:checked, .quick-menu-toggle .quick-toggle-arrow:active:checked, .quick-toggle:active:checked, .calendar .calendar-day.calendar-today:active, .icon-button.default:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .default.screenshot-ui-show-pointer-button:active, .message .message-header .default.message-expand-button:active, ++ .keyboard-brightness-level .button:active:checked, .quick-toggle:active:checked, .calendar .calendar-day.calendar-today:active, .icon-button.default:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .default.screenshot-ui-show-pointer-button:active, .message .message-header .default.message-expand-button:active, + .message .message-header .default.message-close-button:active, .calendar .calendar-month-header .default.pager-button:active, .button.default:active { + color: -st-accent-fg-color; + background-color: st-darken(-st-accent-color, 9%); } - .keyboard-brightness-level .button:active:hover:checked, .quick-menu-toggle .quick-toggle-arrow:active:hover:checked, .quick-toggle:active:hover:checked, .calendar .calendar-day.calendar-today:active:hover, .icon-button.default:active:hover, .default.login-dialog-button.cancel-button:active:hover, .default.login-dialog-button.switch-user-button:active:hover, .default.login-dialog-button.login-dialog-session-list-button:active:hover, .default.screenshot-ui-show-pointer-button:active:hover, .message .message-header .default.message-expand-button:active:hover, ++ .keyboard-brightness-level .button:active:hover:checked, .quick-toggle:active:hover:checked, .calendar .calendar-day.calendar-today:active:hover, .icon-button.default:active:hover, .default.login-dialog-button.cancel-button:active:hover, .default.login-dialog-button.switch-user-button:active:hover, .default.login-dialog-button.login-dialog-session-list-button:active:hover, .default.screenshot-ui-show-pointer-button:active:hover, .message .message-header .default.message-expand-button:active:hover, + .message .message-header .default.message-close-button:active:hover, .calendar .calendar-month-header .default.pager-button:active:hover, .button.default:active:hover { + background-color: st-darken(st-darken(-st-accent-color, 9%), 4%); } - .keyboard-brightness-level .button:active:focus:checked, .quick-menu-toggle .quick-toggle-arrow:active:focus:checked, .quick-toggle:active:focus:checked, .calendar .calendar-day.calendar-today:active:focus, .icon-button.default:active:focus, .default.login-dialog-button.cancel-button:active:focus, .default.login-dialog-button.switch-user-button:active:focus, .default.login-dialog-button.login-dialog-session-list-button:active:focus, .default.screenshot-ui-show-pointer-button:active:focus, .message .message-header .default.message-expand-button:active:focus, ++ .keyboard-brightness-level .button:active:focus:checked, .quick-toggle:active:focus:checked, .calendar .calendar-day.calendar-today:active:focus, .icon-button.default:active:focus, .default.login-dialog-button.cancel-button:active:focus, .default.login-dialog-button.switch-user-button:active:focus, .default.login-dialog-button.login-dialog-session-list-button:active:focus, .default.screenshot-ui-show-pointer-button:active:focus, .message .message-header .default.message-expand-button:active:focus, + .message .message-header .default.message-close-button:active:focus, .calendar .calendar-month-header .default.pager-button:active:focus, .button.default:active:focus { + background-color: st-mix(-st-accent-color, st-darken(-st-accent-color, 9%), 5%); } + +.popup-sub-menu .popup-menu-item, .popup-menu-item { + font-weight: normal; + spacing: 6px; + transition-duration: 100ms; + padding: 9px 12px; } + +#LookingGlassExtensions .lg-extension, #LookingGlassWindows .lg-window, .calendar, .datemenu-today-button, .quick-toggle-menu, .message, .events-button, +.world-clocks-button, +.weather-button { + border-radius: 12px; + padding: 0.818em; + margin: 4px; + background-color: #ffffff; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.03); + border: 1px solid rgba(0, 0, 0, 0.09); } + +.quick-toggle-menu, .message, .events-button, +.world-clocks-button, +.weather-button { - color: #282828; ++ color: #222226; + background-color: #ffffff; } + .quick-toggle-menu:hover, .message:hover, .events-button:hover, + .world-clocks-button:hover, + .weather-button:hover { - color: #282828; ++ color: #222226; + background-color: st-darken(#ffffff, 4%); } + .quick-toggle-menu:active, .message:active, .events-button:active, + .world-clocks-button:active, + .weather-button:active { - color: #282828; ++ color: #222226; + background-color: st-darken(#ffffff, 9%); } + .quick-toggle-menu:active:hover, .message:active:hover, .events-button:active:hover, + .world-clocks-button:active:hover, + .weather-button:active:hover { + background-color: st-darken(st-darken(#ffffff, 9%), 4%); } + .quick-toggle-menu:active:focus, .message:active:focus, .events-button:active:focus, + .world-clocks-button:active:focus, + .weather-button:active:focus { + background-color: st-mix(-st-accent-color, st-darken(#ffffff, 9%), 5%); } + .quick-toggle-menu:focus, .message:focus, .events-button:focus, + .world-clocks-button:focus, + .weather-button:focus { - color: #282828; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; ++ color: #222226; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; + background-color: st-mix(-st-accent-color, #ffffff, 5%); } + .quick-toggle-menu:focus:hover, .message:focus:hover, .events-button:focus:hover, + .world-clocks-button:focus:hover, + .weather-button:focus:hover { + background-color: st-mix(-st-accent-color, st-darken(#ffffff, 4%), 5%); } + .quick-toggle-menu:insensitive, .message:insensitive, .events-button:insensitive, + .world-clocks-button:insensitive, + .weather-button:insensitive { - color: st-transparentize(#282828, 0.6); ++ color: st-transparentize(#222226, 0.6); + background-color: st-lighten(#ffffff, 3%); } + +.calendar, .datemenu-today-button { + border: 1px solid transparent !important; + background-color: transparent; + border-color: transparent; + box-shadow: none; } + .calendar:insensitive, .datemenu-today-button:insensitive { + background-color: transparent !important; } + .calendar:hover, .datemenu-today-button:hover { - color: #282828; - background-color: st-darken(whitesmoke, 7%); } ++ color: #222226; ++ background-color: st-darken(#fafafb, 7%); } + .calendar:active, .datemenu-today-button:active { - color: #282828; - background-color: st-darken(whitesmoke, 9%); } ++ color: #222226; ++ background-color: st-darken(#fafafb, 9%); } + .calendar:active:hover, .datemenu-today-button:active:hover { - background-color: st-darken(st-darken(whitesmoke, 9%), 7%); } ++ background-color: st-darken(st-darken(#fafafb, 9%), 7%); } + .calendar:active:focus, .datemenu-today-button:active:focus { - background-color: st-mix(-st-accent-color, st-darken(whitesmoke, 9%), 5%); } ++ background-color: st-mix(-st-accent-color, st-darken(#fafafb, 9%), 5%); } + .calendar:focus, .datemenu-today-button:focus { - color: #282828; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; ++ color: #222226; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; + background-color: st-mix(-st-accent-color, #ffffff, 5%); } + .calendar:focus:hover, .datemenu-today-button:focus:hover { + background-color: st-mix(-st-accent-color, st-darken(#ffffff, 4%), 5%); } + .calendar:insensitive, .datemenu-today-button:insensitive { - color: st-transparentize(#282828, 0.6); ++ color: st-transparentize(#222226, 0.6); + background-color: st-lighten(#ffffff, 3%); } + +.unlock-dialog .login-dialog-prompt-entry, .login-dialog .login-dialog-prompt-entry, .app-folder-dialog .folder-name-container .folder-name-entry, .search-entry, .lg-dialog StEntry, StEntry { + border-radius: 8px; + padding: 9px 9px; + selection-background-color: st-transparentize(-st-accent-color, 0.7); - selected-color: #282828; } ++ selected-color: #222226; } + +StEntry { - background-color: gainsboro; - color: rgba(40, 40, 40, 0.7); } ++ background-color: #e0e0e1; ++ color: rgba(34, 34, 38, 0.7); } + StEntry:hover { - background-color: #d2d2d2; - color: #282828; } ++ background-color: #d6d6d7; ++ color: #222226; } + StEntry:focus { - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, gainsboro, 5%); - color: #282828; } ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, #e0e0e1, 5%); ++ color: #222226; } + StEntry:insensitive { - background-color: #e4e4e4; - color: rgba(40, 40, 40, 0.5); } ++ background-color: #e8e8e9; ++ color: rgba(34, 34, 38, 0.5); } + StEntry StLabel.hint-text { - color: rgba(40, 40, 40, 0.7); } ++ color: rgba(34, 34, 38, 0.7); } + +.notification-button, .message .message-header .message-expand-button, +.message .message-header .message-close-button { + font-weight: bold; + padding: 6px 12px; + border-radius: 8px; - color: #282828; - background-color: rgba(40, 40, 40, 0.15); } ++ color: #222226; ++ background-color: rgba(34, 34, 38, 0.15); } + .notification-button:focus, .message .message-header .message-expand-button:focus, + .message .message-header .message-close-button:focus { - color: #282828; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.15), 5%); } ++ color: #222226; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.15), 5%); } + .notification-button:focus:hover, .message .message-header .message-expand-button:focus:hover, + .message .message-header .message-close-button:focus:hover { - background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.3), 5%); } ++ background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.3), 5%); } + .notification-button:hover, .message .message-header .message-expand-button:hover, + .message .message-header .message-close-button:hover { - color: #282828; - background-color: rgba(40, 40, 40, 0.3); } ++ color: #222226; ++ background-color: rgba(34, 34, 38, 0.3); } + .notification-button:active, .message .message-header .message-expand-button:active, + .message .message-header .message-close-button:active { - color: #282828; - background-color: rgba(40, 40, 40, 0.2); } ++ color: #222226; ++ background-color: rgba(34, 34, 38, 0.2); } + .notification-button:active:hover, .message .message-header .message-expand-button:active:hover, + .message .message-header .message-close-button:active:hover { - background-color: rgba(40, 40, 40, 0.2); } ++ background-color: rgba(34, 34, 38, 0.2); } + .notification-button:active:focus, .message .message-header .message-expand-button:active:focus, + .message .message-header .message-close-button:active:focus { - background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.2), 5%); } ++ background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.2), 5%); } + .notification-button:checked, .message .message-header .message-expand-button:checked, + .message .message-header .message-close-button:checked { - color: #282828; - background-color: st-darken(st-mix(#282828, whitesmoke, 12%), 8%); } ++ color: #222226; ++ background-color: st-darken(st-mix(#222226, #fafafb, 12%), 8%); } + .notification-button:checked:hover, .message .message-header .message-expand-button:checked:hover, + .message .message-header .message-close-button:checked:hover { - background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 8%), 4%); } ++ background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 8%), 4%); } + .notification-button:checked:active, .message .message-header .message-expand-button:checked:active, + .message .message-header .message-close-button:checked:active { - background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 8%), 9%); } ++ background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 8%), 9%); } + .notification-button:insensitive, .message .message-header .message-expand-button:insensitive, + .message .message-header .message-close-button:insensitive { - color: st-transparentize(#282828, 0.6); - background-color: rgba(40, 40, 40, 0.1); } ++ color: st-transparentize(#222226, 0.6); ++ background-color: rgba(34, 34, 38, 0.1); } + +.modal-dialog .modal-dialog-button-box .modal-dialog-button { + font-weight: bold; + padding: 12px; + border-radius: 12px; - color: #282828; - background-color: rgba(40, 40, 40, 0.1); } ++ color: #222226; ++ background-color: rgba(34, 34, 38, 0.1); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:focus { - color: #282828; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.1), 5%); } ++ color: #222226; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.1), 5%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:focus:hover { - background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.13), 5%); } ++ background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.13), 5%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:hover { - color: #282828; - background-color: rgba(40, 40, 40, 0.13); } ++ color: #222226; ++ background-color: rgba(34, 34, 38, 0.13); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:active { - color: #282828; - background-color: rgba(40, 40, 40, 0.16); } ++ color: #222226; ++ background-color: rgba(34, 34, 38, 0.16); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:active:hover { - background-color: rgba(40, 40, 40, 0.19); } ++ background-color: rgba(34, 34, 38, 0.19); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:active:focus { - background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.16), 5%); } ++ background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.16), 5%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked { - color: #282828; - background-color: st-darken(st-mix(#282828, whitesmoke, 12%), 8%); } ++ color: #222226; ++ background-color: st-darken(st-mix(#222226, #fafafb, 12%), 8%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked:hover { - background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 8%), 4%); } ++ background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 8%), 4%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked:active { - background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 8%), 9%); } ++ background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 8%), 9%); } + .modal-dialog .modal-dialog-button-box .modal-dialog-button:insensitive { - color: st-transparentize(#282828, 0.6); - background-color: st-lighten(st-mix(#282828, whitesmoke, 12%), 3%); } ++ color: st-transparentize(#222226, 0.6); ++ background-color: st-lighten(st-mix(#222226, #fafafb, 12%), 3%); } + +.dash-label, .window-caption, .screenshot-ui-tooltip { + background-color: rgba(0, 0, 0, 0.9); + border: 1px solid rgba(255, 255, 255, 0.1); + color: #ffffff; + border-radius: 999px; + padding: 6px 12px; + text-align: center; } + +/* General Typography */ +.unlock-dialog-clock .unlock-dialog-clock-date, .app-folder-dialog .folder-name-container .folder-name-label, .app-folder-dialog .folder-name-container .folder-name-entry, .search-statustext { + font-weight: 800; + font-size: 1.818em; } + - .conflicting-session-dialog-content .conflicting-session-dialog-title, .message-dialog-content .message-dialog-title, .message-list .message-list-placeholder, .datemenu-today-button .date-label { ++.conflicting-session-dialog-content .conflicting-session-dialog-title, .message-dialog-content .message-dialog-title, .datemenu-today-button .date-label { + font-weight: 800; + font-size: 1.364em; } + +.login-dialog .user-widget.horizontal .user-widget-label, - .unlock-dialog .user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title { ++.unlock-dialog .user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title, .message-list .message-list-placeholder { + font-weight: 700; + font-size: 1.364em; } + +.login-dialog-auth-list-label, #LookingGlassDebugFlags .lg-debug-flags-header, #LookingGlassExtensions .lg-extensions-none, .word-suggestions, .bt-menu-placeholder.popup-menu-item, .restart-message, .polkit-dialog-user-layout .polkit-dialog-user-label, +.polkit-dialog-user-layout .polkit-dialog-user-root-label, .message-dialog-content .message-dialog-title.lightweight { + font-weight: 700; + font-size: 1.182em; } + - .login-dialog-not-listed-label, #LookingGlassExtensions .lg-extension .lg-extension-name, #LookingGlassWindows .lg-window .lg-window-name, #LookingGlassPropertyInspector .lg-obj-inspector-title, .background-app-item .title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-box .weather-header-box .weather-header, .world-clocks-button .world-clocks-header, .events-button .events-box .events-list .event-box .event-summary, .events-button .events-box .events-title, .calendar .calendar-month-header .calendar-month-label { ++.login-dialog-not-listed-label, #LookingGlassExtensions .lg-extension .lg-extension-name, #LookingGlassWindows .lg-window .lg-window-name, #LookingGlassPropertyInspector .lg-obj-inspector-title, .background-app-item .title, .quick-toggle .quick-toggle-title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-box .weather-header-box .weather-header, .world-clocks-button .world-clocks-header, .events-button .events-box .events-list .event-box .event-summary, .events-button .events-box .events-title, .calendar .calendar-month-header .calendar-month-label { + font-weight: 700; + font-size: 1em; } + +.quick-toggle-menu .header .subtitle, .app-menu .popup-inactive-menu-item:first-child > StLabel { + font-weight: 700; + font-size: 0.818em; } + - .lg-completions-text, .caps-lock-warning-label, .background-app-item .subtitle, .quick-toggle StBoxLayout > .quick-toggle-subtitle, .screenshot-ui-type-button .icon-label-button-container, .prompt-dialog .prompt-dialog-error-label, ++.lg-completions-text, .caps-lock-warning-label, .background-app-item .subtitle, .quick-toggle .quick-toggle-subtitle, .screenshot-ui-type-button .icon-label-button-container, .prompt-dialog .prompt-dialog-error-label, +.prompt-dialog .prompt-dialog-info-label, +.prompt-dialog .prompt-dialog-null-label, .run-dialog .run-dialog-description, .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description, .message .message-header .message-header-content .event-time, .world-clocks-button .world-clocks-grid .world-clocks-timezone, .events-button .events-box .events-list .event-box .event-time { + font-weight: 400; + font-size: 0.818em; } + +.weather-button .weather-box .weather-grid .weather-forecast-time, .calendar .calendar-week-number, .calendar .calendar-day-heading, .calendar .calendar-day { + font-weight: 400; + font-size: 0.818em; } + +#LookingGlassDebugFlags .lg-debug-flag-button StLabel, #LookingGlassEvaluator .evaluator-results, .lg-dialog .actor-link { + font-family: monospace; } + +.unlock-dialog-clock .unlock-dialog-clock-time, #panel, .weather-button .weather-box .weather-grid .weather-forecast-temp, .world-clocks-button .world-clocks-grid .world-clocks-timezone, .world-clocks-button .world-clocks-grid .world-clocks-time, .events-button .events-box .events-list .event-box .event-time, .calendar .calendar-day-heading, .calendar .calendar-day { + font-feature-settings: "tnum"; } + +/* OSD Elements */ +#LookingGlassDialog, .screenshot-ui-panel, .workspace-switcher, .switcher-list, .resize-popup, .osd-window { + color: #ffffff; - background-color: #353535; ++ background-color: #2e2e33; + border: 1px solid rgba(255, 255, 255, 0.02); + border-radius: 999px; + padding: 12px; } + +.lg-dialog StEntry { - background-color: #4d4d4d; ++ background-color: #47474c; + color: rgba(255, 255, 255, 0.7); } + .lg-dialog StEntry:hover { - background-color: #575757; ++ background-color: #515157; + color: #ffffff; } + .lg-dialog StEntry:focus { - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, #4d4d4d, 5%); ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, #47474c, 5%); + color: #ffffff; } + .lg-dialog StEntry:insensitive { - background-color: #454545; ++ background-color: #404044; + color: rgba(255, 255, 255, 0.5); } + .lg-dialog StEntry StLabel.hint-text { + color: rgba(255, 255, 255, 0.7); } + +#LookingGlassDebugFlags .lg-debug-flag-button, #LookingGlassPropertyInspector .lg-obj-inspector-close-button, +#LookingGlassPropertyInspector .lg-obj-inspector-button, #LookingGlassDialog > #Toolbar .lg-toolbar-button { + color: #ffffff; - background-color: st-mix(#ffffff, #353535, 12%); } ++ background-color: st-mix(#ffffff, #2e2e33, 12%); } + #LookingGlassDebugFlags .lg-debug-flag-button:focus, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:focus, + #LookingGlassPropertyInspector .lg-obj-inspector-button:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus { + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 12%), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, st-mix(#ffffff, #2e2e33, 12%), 5%); } + #LookingGlassDebugFlags .lg-debug-flag-button:focus:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:focus:hover, + #LookingGlassPropertyInspector .lg-obj-inspector-button:focus:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 12%), 4%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #2e2e33, 12%), 4%), 5%); } + #LookingGlassDebugFlags .lg-debug-flag-button:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:hover, + #LookingGlassPropertyInspector .lg-obj-inspector-button:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:hover { + color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #353535, 12%), 4%); } ++ background-color: st-lighten(st-mix(#ffffff, #2e2e33, 12%), 4%); } + #LookingGlassDebugFlags .lg-debug-flag-button:active, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active, + #LookingGlassPropertyInspector .lg-obj-inspector-button:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active { + color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #353535, 12%), 9%); } ++ background-color: st-lighten(st-mix(#ffffff, #2e2e33, 12%), 9%); } + #LookingGlassDebugFlags .lg-debug-flag-button:active:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active:hover, + #LookingGlassPropertyInspector .lg-obj-inspector-button:active:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 12%), 9%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 12%), 9%), 4%); } + #LookingGlassDebugFlags .lg-debug-flag-button:active:focus, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active:focus, + #LookingGlassPropertyInspector .lg-obj-inspector-button:active:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 12%), 9%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #2e2e33, 12%), 9%), 5%); } + #LookingGlassDebugFlags .lg-debug-flag-button:checked, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked, + #LookingGlassPropertyInspector .lg-obj-inspector-button:checked, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked { + color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #353535, 12%), 8%); } ++ background-color: st-lighten(st-mix(#ffffff, #2e2e33, 12%), 8%); } + #LookingGlassDebugFlags .lg-debug-flag-button:checked:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked:hover, + #LookingGlassPropertyInspector .lg-obj-inspector-button:checked:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 12%), 8%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 12%), 8%), 4%); } + #LookingGlassDebugFlags .lg-debug-flag-button:checked:active, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked:active, + #LookingGlassPropertyInspector .lg-obj-inspector-button:checked:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:active { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 12%), 8%), 9%); } ++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 12%), 8%), 9%); } + #LookingGlassDebugFlags .lg-debug-flag-button:insensitive, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:insensitive, + #LookingGlassPropertyInspector .lg-obj-inspector-button:insensitive, #LookingGlassDialog > #Toolbar .lg-toolbar-button:insensitive { + color: st-transparentize(#ffffff, 0.6); - background-color: st-darken(st-mix(#ffffff, #353535, 12%), 3%); } ++ background-color: st-darken(st-mix(#ffffff, #2e2e33, 12%), 3%); } + +#LookingGlassDialog .notebook-tab, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button { + color: #ffffff; - background-color: #353535; } ++ background-color: #2e2e33; } + #LookingGlassDialog .notebook-tab:focus, .screenshot-ui-show-pointer-button:focus, .screenshot-ui-type-button:focus { + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, rgba(46, 46, 51, 0.25), 5%); } + #LookingGlassDialog .notebook-tab:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .screenshot-ui-type-button:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(#2e2e33, 7%), 5%); } + #LookingGlassDialog .notebook-tab:hover, .screenshot-ui-show-pointer-button:hover, .screenshot-ui-type-button:hover { + color: #ffffff; - background-color: st-lighten(#353535, 7%); } ++ background-color: st-lighten(#2e2e33, 7%); } + #LookingGlassDialog .notebook-tab:active, .screenshot-ui-show-pointer-button:active, .screenshot-ui-type-button:active { + color: #ffffff; - background-color: st-lighten(#353535, 9%); } ++ background-color: st-lighten(#2e2e33, 9%); } + #LookingGlassDialog .notebook-tab:active:hover, .screenshot-ui-show-pointer-button:active:hover, .screenshot-ui-type-button:active:hover { - background-color: st-lighten(st-lighten(#353535, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#2e2e33, 9%), 7%); } + #LookingGlassDialog .notebook-tab:active:focus, .screenshot-ui-show-pointer-button:active:focus, .screenshot-ui-type-button:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(#2e2e33, 9%), 5%); } + #LookingGlassDialog .notebook-tab:checked, .screenshot-ui-show-pointer-button:checked, .screenshot-ui-type-button:checked { + color: #ffffff; - background-color: st-lighten(#353535, 8%); } ++ background-color: st-lighten(#2e2e33, 8%); } + #LookingGlassDialog .notebook-tab:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .screenshot-ui-type-button:checked:hover { - background-color: st-lighten(st-lighten(#353535, 8%), 7%); } ++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 7%); } + #LookingGlassDialog .notebook-tab:checked:active, .screenshot-ui-show-pointer-button:checked:active, .screenshot-ui-type-button:checked:active { - background-color: st-lighten(st-lighten(#353535, 8%), 9%); } ++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 9%); } + #LookingGlassDialog .notebook-tab:insensitive, .screenshot-ui-show-pointer-button:insensitive, .screenshot-ui-type-button:insensitive { + color: st-transparentize(#ffffff, 0.6); - background-color: #353535; } ++ background-color: #2e2e33; } + +/* System Elements */ +.login-dialog .login-dialog-prompt-entry, .app-folder-dialog .folder-name-container .folder-name-entry, .search-entry { - background-color: #4c4c4c; - color: rgba(245, 245, 245, 0.7); } ++ background-color: #47474b; ++ color: rgba(250, 250, 251, 0.7); } + .login-dialog .login-dialog-prompt-entry:hover, .app-folder-dialog .folder-name-container .folder-name-entry:hover, .search-entry:hover { - background-color: #565656; - color: whitesmoke; } ++ background-color: #515155; ++ color: #fafafb; } + .login-dialog .login-dialog-prompt-entry:focus, .app-folder-dialog .folder-name-container .folder-name-entry:focus, .search-entry:focus { - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, #4c4c4c, 5%); - color: whitesmoke; } ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, #47474b, 5%); ++ color: #fafafb; } + .login-dialog .login-dialog-prompt-entry:insensitive, .app-folder-dialog .folder-name-container .folder-name-entry:insensitive, .search-entry:insensitive { - background-color: #444444; - color: rgba(245, 245, 245, 0.5); } ++ background-color: #404043; ++ color: rgba(250, 250, 251, 0.5); } + .login-dialog .login-dialog-prompt-entry StLabel.hint-text, .app-folder-dialog .folder-name-container .folder-name-entry StLabel.hint-text, .search-entry StLabel.hint-text { - color: rgba(245, 245, 245, 0.7); } ++ color: rgba(250, 250, 251, 0.7); } + +.login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button { - color: whitesmoke; - background-color: st-mix(whitesmoke, #353535, 12%); } ++ color: #fafafb; ++ background-color: st-mix(#fafafb, #2e2e33, 12%); } + .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive { - color: st-transparentize(whitesmoke, 0.6); - background-color: st-lighten(st-mix(whitesmoke, #353535, 12%), 3%); } ++ color: st-transparentize(#fafafb, 0.6); ++ background-color: st-lighten(st-mix(#fafafb, #2e2e33, 12%), 3%); } + .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus { - color: whitesmoke; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, st-mix(whitesmoke, #353535, 12%), 5%); } ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, st-mix(#fafafb, #2e2e33, 12%), 5%); } + .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover { - background-color: st-mix(-st-accent-color, st-darken(st-mix(whitesmoke, #353535, 12%), 4%), 5%); } ++ background-color: st-mix(-st-accent-color, st-darken(st-mix(#fafafb, #2e2e33, 12%), 4%), 5%); } + .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover { - color: whitesmoke; - background-color: st-darken(st-mix(whitesmoke, #353535, 12%), 4%); } ++ color: #fafafb; ++ background-color: st-darken(st-mix(#fafafb, #2e2e33, 12%), 4%); } + .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active { - color: whitesmoke; - background-color: st-darken(st-mix(whitesmoke, #353535, 12%), 9%); } ++ color: #fafafb; ++ background-color: st-darken(st-mix(#fafafb, #2e2e33, 12%), 9%); } + .login-dialog-button.cancel-button:active:hover, .login-dialog-button.switch-user-button:active:hover, .login-dialog-button.login-dialog-session-list-button:active:hover { - background-color: st-darken(st-darken(st-mix(whitesmoke, #353535, 12%), 9%), 4%); } ++ background-color: st-darken(st-darken(st-mix(#fafafb, #2e2e33, 12%), 9%), 4%); } + .login-dialog-button.cancel-button:active:focus, .login-dialog-button.switch-user-button:active:focus, .login-dialog-button.login-dialog-session-list-button:active:focus { - background-color: st-mix(-st-accent-color, st-darken(st-mix(whitesmoke, #353535, 12%), 9%), 5%); } ++ background-color: st-mix(-st-accent-color, st-darken(st-mix(#fafafb, #2e2e33, 12%), 9%), 5%); } + .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked { - color: whitesmoke; - background-color: st-darken(st-mix(whitesmoke, #353535, 12%), 8%); } ++ color: #fafafb; ++ background-color: st-darken(st-mix(#fafafb, #2e2e33, 12%), 8%); } + .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover { - background-color: st-darken(st-darken(st-mix(whitesmoke, #353535, 12%), 8%), 4%); } ++ background-color: st-darken(st-darken(st-mix(#fafafb, #2e2e33, 12%), 8%), 4%); } + .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active { - background-color: st-darken(st-darken(st-mix(whitesmoke, #353535, 12%), 8%), 9%); } ++ background-color: st-darken(st-darken(st-mix(#fafafb, #2e2e33, 12%), 8%), 9%); } + +/* Lockscreen Elements */ +.unlock-dialog .button, +.unlock-dialog .icon-button, +.unlock-dialog .calendar .calendar-month-header .pager-button, +.calendar .calendar-month-header .unlock-dialog .pager-button, +.unlock-dialog .message .message-header .message-expand-button, +.message .message-header .unlock-dialog .message-expand-button, +.unlock-dialog .message .message-header .message-close-button, +.message .message-header .unlock-dialog .message-close-button, +.unlock-dialog .screenshot-ui-show-pointer-button, +.unlock-dialog .login-dialog-button.cancel-button, +.unlock-dialog .login-dialog-button.switch-user-button, +.unlock-dialog .login-dialog-button.login-dialog-session-list-button { - color: whitesmoke; - background-color: rgba(245, 245, 245, 0.1); } ++ color: #fafafb; ++ background-color: rgba(250, 250, 251, 0.1); } + .unlock-dialog .button:focus, + .unlock-dialog .icon-button:focus, + .unlock-dialog .calendar .calendar-month-header .pager-button:focus, + .calendar .calendar-month-header .unlock-dialog .pager-button:focus, + .unlock-dialog .message .message-header .message-expand-button:focus, + .message .message-header .unlock-dialog .message-expand-button:focus, + .unlock-dialog .message .message-header .message-close-button:focus, + .message .message-header .unlock-dialog .message-close-button:focus, + .unlock-dialog .screenshot-ui-show-pointer-button:focus, + .unlock-dialog .login-dialog-button.cancel-button:focus, + .unlock-dialog .login-dialog-button.switch-user-button:focus, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:focus { - color: whitesmoke; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.1), 5%); } ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, rgba(250, 250, 251, 0.1), 5%); } + .unlock-dialog .button:focus:hover, + .unlock-dialog .icon-button:focus:hover, + .unlock-dialog .calendar .calendar-month-header .pager-button:focus:hover, + .calendar .calendar-month-header .unlock-dialog .pager-button:focus:hover, + .unlock-dialog .message .message-header .message-expand-button:focus:hover, + .message .message-header .unlock-dialog .message-expand-button:focus:hover, + .unlock-dialog .message .message-header .message-close-button:focus:hover, + .message .message-header .unlock-dialog .message-close-button:focus:hover, + .unlock-dialog .screenshot-ui-show-pointer-button:focus:hover, + .unlock-dialog .login-dialog-button.cancel-button:focus:hover, + .unlock-dialog .login-dialog-button.switch-user-button:focus:hover, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:focus:hover { - background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.13), 5%); } ++ background-color: st-mix(-st-accent-color, rgba(250, 250, 251, 0.13), 5%); } + .unlock-dialog .button:hover, + .unlock-dialog .icon-button:hover, + .unlock-dialog .calendar .calendar-month-header .pager-button:hover, + .calendar .calendar-month-header .unlock-dialog .pager-button:hover, + .unlock-dialog .message .message-header .message-expand-button:hover, + .message .message-header .unlock-dialog .message-expand-button:hover, + .unlock-dialog .message .message-header .message-close-button:hover, + .message .message-header .unlock-dialog .message-close-button:hover, + .unlock-dialog .screenshot-ui-show-pointer-button:hover, + .unlock-dialog .login-dialog-button.cancel-button:hover, + .unlock-dialog .login-dialog-button.switch-user-button:hover, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:hover { - color: whitesmoke; - background-color: rgba(245, 245, 245, 0.13); } ++ color: #fafafb; ++ background-color: rgba(250, 250, 251, 0.13); } + .unlock-dialog .button:active, + .unlock-dialog .icon-button:active, + .unlock-dialog .calendar .calendar-month-header .pager-button:active, + .calendar .calendar-month-header .unlock-dialog .pager-button:active, + .unlock-dialog .message .message-header .message-expand-button:active, + .message .message-header .unlock-dialog .message-expand-button:active, + .unlock-dialog .message .message-header .message-close-button:active, + .message .message-header .unlock-dialog .message-close-button:active, + .unlock-dialog .screenshot-ui-show-pointer-button:active, + .unlock-dialog .login-dialog-button.cancel-button:active, + .unlock-dialog .login-dialog-button.switch-user-button:active, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active { - color: whitesmoke; - background-color: rgba(245, 245, 245, 0.16); } ++ color: #fafafb; ++ background-color: rgba(250, 250, 251, 0.16); } + .unlock-dialog .button:active:hover, + .unlock-dialog .icon-button:active:hover, + .unlock-dialog .calendar .calendar-month-header .pager-button:active:hover, + .calendar .calendar-month-header .unlock-dialog .pager-button:active:hover, + .unlock-dialog .message .message-header .message-expand-button:active:hover, + .message .message-header .unlock-dialog .message-expand-button:active:hover, + .unlock-dialog .message .message-header .message-close-button:active:hover, + .message .message-header .unlock-dialog .message-close-button:active:hover, + .unlock-dialog .screenshot-ui-show-pointer-button:active:hover, + .unlock-dialog .login-dialog-button.cancel-button:active:hover, + .unlock-dialog .login-dialog-button.switch-user-button:active:hover, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active:hover { - background-color: rgba(245, 245, 245, 0.19); } ++ background-color: rgba(250, 250, 251, 0.19); } + .unlock-dialog .button:active:focus, + .unlock-dialog .icon-button:active:focus, + .unlock-dialog .calendar .calendar-month-header .pager-button:active:focus, + .calendar .calendar-month-header .unlock-dialog .pager-button:active:focus, + .unlock-dialog .message .message-header .message-expand-button:active:focus, + .message .message-header .unlock-dialog .message-expand-button:active:focus, + .unlock-dialog .message .message-header .message-close-button:active:focus, + .message .message-header .unlock-dialog .message-close-button:active:focus, + .unlock-dialog .screenshot-ui-show-pointer-button:active:focus, + .unlock-dialog .login-dialog-button.cancel-button:active:focus, + .unlock-dialog .login-dialog-button.switch-user-button:active:focus, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active:focus { - background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.16), 5%); } ++ background-color: st-mix(-st-accent-color, rgba(250, 250, 251, 0.16), 5%); } + .unlock-dialog .button:checked, + .unlock-dialog .icon-button:checked, + .unlock-dialog .calendar .calendar-month-header .pager-button:checked, + .calendar .calendar-month-header .unlock-dialog .pager-button:checked, + .unlock-dialog .message .message-header .message-expand-button:checked, + .message .message-header .unlock-dialog .message-expand-button:checked, + .unlock-dialog .message .message-header .message-close-button:checked, + .message .message-header .unlock-dialog .message-close-button:checked, + .unlock-dialog .screenshot-ui-show-pointer-button:checked, + .unlock-dialog .login-dialog-button.cancel-button:checked, + .unlock-dialog .login-dialog-button.switch-user-button:checked, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked { - color: whitesmoke; - background-color: st-darken(st-mix(whitesmoke, whitesmoke, 12%), 8%); } ++ color: #fafafb; ++ background-color: st-darken(st-mix(#fafafb, #fafafb, 12%), 8%); } + .unlock-dialog .button:checked:hover, + .unlock-dialog .icon-button:checked:hover, + .unlock-dialog .calendar .calendar-month-header .pager-button:checked:hover, + .calendar .calendar-month-header .unlock-dialog .pager-button:checked:hover, + .unlock-dialog .message .message-header .message-expand-button:checked:hover, + .message .message-header .unlock-dialog .message-expand-button:checked:hover, + .unlock-dialog .message .message-header .message-close-button:checked:hover, + .message .message-header .unlock-dialog .message-close-button:checked:hover, + .unlock-dialog .screenshot-ui-show-pointer-button:checked:hover, + .unlock-dialog .login-dialog-button.cancel-button:checked:hover, + .unlock-dialog .login-dialog-button.switch-user-button:checked:hover, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked:hover { - background-color: st-darken(st-darken(st-mix(whitesmoke, whitesmoke, 12%), 8%), 4%); } ++ background-color: st-darken(st-darken(st-mix(#fafafb, #fafafb, 12%), 8%), 4%); } + .unlock-dialog .button:checked:active, + .unlock-dialog .icon-button:checked:active, + .unlock-dialog .calendar .calendar-month-header .pager-button:checked:active, + .calendar .calendar-month-header .unlock-dialog .pager-button:checked:active, + .unlock-dialog .message .message-header .message-expand-button:checked:active, + .message .message-header .unlock-dialog .message-expand-button:checked:active, + .unlock-dialog .message .message-header .message-close-button:checked:active, + .message .message-header .unlock-dialog .message-close-button:checked:active, + .unlock-dialog .screenshot-ui-show-pointer-button:checked:active, + .unlock-dialog .login-dialog-button.cancel-button:checked:active, + .unlock-dialog .login-dialog-button.switch-user-button:checked:active, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked:active { - background-color: st-darken(st-darken(st-mix(whitesmoke, whitesmoke, 12%), 8%), 9%); } ++ background-color: st-darken(st-darken(st-mix(#fafafb, #fafafb, 12%), 8%), 9%); } + .unlock-dialog .button:insensitive, + .unlock-dialog .icon-button:insensitive, + .unlock-dialog .calendar .calendar-month-header .pager-button:insensitive, + .calendar .calendar-month-header .unlock-dialog .pager-button:insensitive, + .unlock-dialog .message .message-header .message-expand-button:insensitive, + .message .message-header .unlock-dialog .message-expand-button:insensitive, + .unlock-dialog .message .message-header .message-close-button:insensitive, + .message .message-header .unlock-dialog .message-close-button:insensitive, + .unlock-dialog .screenshot-ui-show-pointer-button:insensitive, + .unlock-dialog .login-dialog-button.cancel-button:insensitive, + .unlock-dialog .login-dialog-button.switch-user-button:insensitive, + .unlock-dialog .login-dialog-button.login-dialog-session-list-button:insensitive { - color: st-transparentize(whitesmoke, 0.6); - background-color: st-lighten(st-mix(whitesmoke, whitesmoke, 12%), 3%); } ++ color: st-transparentize(#fafafb, 0.6); ++ background-color: st-lighten(st-mix(#fafafb, #fafafb, 12%), 3%); } + +.unlock-dialog .login-dialog-prompt-entry { - background-color: rgba(245, 245, 245, 0.1); - color: rgba(245, 245, 245, 0.7); } ++ background-color: rgba(250, 250, 251, 0.1); ++ color: rgba(250, 250, 251, 0.7); } + .unlock-dialog .login-dialog-prompt-entry:hover { + background-color: rgba(255, 255, 255, 0.1); - color: whitesmoke; } ++ color: #fafafb; } + .unlock-dialog .login-dialog-prompt-entry:focus { - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.1), 5%); - color: whitesmoke; - box-shadow: inset 0 0 0 2px rgba(245, 245, 245, 0.4) !important; - background-color: st-mix(rgba(245, 245, 245, 0.4), rgba(245, 245, 245, 0.1), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(rgba(250, 250, 251, 0.4), 0.2) !important; ++ background-color: st-mix(-st-accent-color, rgba(250, 250, 251, 0.1), 5%); ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(rgba(250, 250, 251, 0.4), 0.2) !important; ++ background-color: st-mix(rgba(250, 250, 251, 0.4), rgba(250, 250, 251, 0.1), 5%); } + .unlock-dialog .login-dialog-prompt-entry:insensitive { - background-color: rgba(237, 237, 237, 0.1); - color: rgba(245, 245, 245, 0.5); } ++ background-color: rgba(242, 242, 244, 0.1); ++ color: rgba(250, 250, 251, 0.5); } + .unlock-dialog .login-dialog-prompt-entry StLabel.hint-text { - color: rgba(245, 245, 245, 0.7); } ++ color: rgba(250, 250, 251, 0.7); } + +/* WIDGETS */ +.shell-link { + color: st-darken(-st-accent-color, 10%); } + .shell-link:hover { + color: st-lighten(st-darken(-st-accent-color, 10%), 10%); } + +.lowres-icon { + icon-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } + +.icon-dropshadow { + icon-shadow: 0 2px 4px rgba(0, 0, 0, 0.4); } + +/* Entries */ +StEntry StIcon.capslock-warning { + icon-size: 1.091em; - warning-color: #f5c211; ++ warning-color: #e5a50a; + padding: 0 4px; } + +StEntry StIcon.peek-password { + icon-size: 1.091em; + padding: 0 4px; } + +StEntry StLabel.hint-text { + margin-left: 2px; } + +/* Buttons */ +.button { + min-height: 1.5em; } + +.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .screenshot-ui-show-pointer-button, .message .message-header .message-expand-button, +.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button { + border-radius: 999px; + padding: 0.818em; + min-height: 1.091em; } + .icon-button StIcon, .login-dialog-button.cancel-button StIcon, .login-dialog-button.switch-user-button StIcon, .login-dialog-button.login-dialog-session-list-button StIcon, .screenshot-ui-show-pointer-button StIcon, .message .message-header .message-expand-button StIcon, + .message .message-header .message-close-button StIcon, .calendar .calendar-month-header .pager-button StIcon { + icon-size: 1.091em; + -st-icon-style: symbolic; } + +/* Check Boxes */ +.check-box StBoxLayout { + spacing: .8em; } + +.check-box StBin { + border-radius: 7px; + padding: 2px; } + +.check-box:focus StBin { + background-color: rgba(0, 0, 0, 0.01); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.65); } + +.check-box StIcon { + icon-size: 14px; + padding: 1px; + color: transparent; + border-radius: 6px; + border: 2px solid rgba(0, 0, 0, 0.15); } + +.check-box:hover StIcon { + border-color: rgba(0, 0, 0, 0.2); } + +.check-box:active StIcon { + border-color: rgba(0, 0, 0, 0.3); } + +.check-box:checked StIcon { + background-color: -st-accent-color; + color: -st-accent-fg-color; + border-color: transparent; } + +.check-box:checked:hover StIcon { + background-color: st-lighten(-st-accent-color, 5%); + color: st-lighten(-st-accent-fg-color, 5%); } + +.check-box:checked:active StIcon { + background-color: st-darken(-st-accent-color, 7%); + color: st-darken(-st-accent-fg-color, 7%); } + +/* Switches */ +.toggle-switch { + width: 46px; + border-radius: 999px; + transition-duration: 100ms; - color: #282828; ++ color: #222226; + background: rgba(0, 0, 0, 0.15); } + .toggle-switch:hover { + background: rgba(0, 0, 0, 0.2); } + .toggle-switch StIcon { + icon-size: 16px; } + .toggle-switch .handle { + margin: 3px; + width: 20px; + height: 20px; + border-radius: 999px; + background: white; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + transition-duration: 100ms; } + .toggle-switch:checked { + background: -st-accent-color; + color: -st-accent-fg-color; } + .toggle-switch:checked:hover { + background-color: st-lighten(-st-accent-color, 5%); + color: st-lighten(-st-accent-fg-color, 5%); } + .toggle-switch:checked .handle { + background: white; } + +/* Slider */ +.slider { - color: #282828; ++ color: #222226; + -barlevel-height: 4px; - -barlevel-background-color: rgba(40, 40, 40, 0.1); ++ -barlevel-background-color: rgba(34, 34, 38, 0.1); + -barlevel-active-background-color: -st-accent-color; + -barlevel-overdrive-color: #e01b24; + -barlevel-overdrive-separator-width: 1px; + -slider-handle-radius: 0.5455em; } + .slider:hover { - color: #3a3a3a; } ++ color: #333339; } + +/* Scrollbars */ +StScrollView.vfade { + -st-vfade-offset: 68px; } + +StScrollView.hfade { + -st-hfade-offset: 68px; } + +StScrollBar { + padding: 0; } + StScrollView StScrollBar { + min-width: 8px; + min-height: 8px; } + StScrollBar StBin#trough { + border-radius: 0; + background-color: transparent; } + StScrollBar StButton#vhandle, StScrollBar StButton#hhandle { + border-radius: 8px; - background-color: #b8b8b8; ++ background-color: #b9b9bb; + border: 3px solid transparent; + transition: 500ms all ease; } + StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover { - background-color: #8f8f8f; } ++ background-color: #8e8e91; } + StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active { - background-color: #a3a3a3; } ++ background-color: #a4a4a6; } + +/* Popovers/Menus */ +.popup-menu-boxpointer, .candidate-popup-boxpointer { + -arrow-rise: 6px; } + +.popup-menu { + min-width: 15em; - color: #282828; } ++ color: #222226; } + .popup-menu.panel-menu { + margin-bottom: 1.75em; } + +.popup-menu-content, .candidate-popup-content { + padding: 6px; - background-color: whitesmoke; ++ background-color: #fafafb; + border-radius: 20px; - border: 1px solid #e3e3e3; ++ border: 1px solid #e6e6eb; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05); } + +.popup-menu-item { + background-color: transparent; + border-color: transparent; + box-shadow: none; + border-radius: 12px; } + .popup-menu-item:insensitive { + background-color: transparent !important; } - .popup-menu-item:hover { - color: #282828; - background-color: st-darken(st-mix(#282828, #e8e8e8, 12%), 4%); } + .popup-menu-item:active { - color: #282828; - background-color: st-darken(st-mix(#282828, #e8e8e8, 12%), 9%); } ++ color: #222226; ++ background-color: st-darken(#ececf0, 9%); } + .popup-menu-item:active:hover { - background-color: st-darken(st-darken(st-mix(#282828, #e8e8e8, 12%), 9%), 4%); } ++ background-color: st-darken(st-darken(#ececf0, 9%), 7%); } + .popup-menu-item:active:focus { - background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, #e8e8e8, 12%), 9%), 5%); } - .popup-menu-item:selected, .popup-menu-item:checked { - color: #282828; - background-color: st-darken(st-mix(#282828, #e8e8e8, 12%), 8%); } - .popup-menu-item:selected:hover, .popup-menu-item:checked:hover { - background-color: st-darken(st-darken(st-mix(#282828, #e8e8e8, 12%), 8%), 4%); } - .popup-menu-item:selected:active, .popup-menu-item:checked:active { - background-color: st-darken(st-darken(st-mix(#282828, #e8e8e8, 12%), 8%), 9%); } ++ background-color: st-mix(-st-accent-color, st-darken(#ececf0, 9%), 5%); } ++ .popup-menu-item:hover, .popup-menu-item:selected, .popup-menu-item:checked { ++ color: #222226; ++ background-color: st-darken(#ececf0, 7%); } + .popup-menu-item:insensitive { - color: st-transparentize(#282828, 0.6); - background-color: st-lighten(st-mix(#282828, #e8e8e8, 12%), 3%); } ++ color: st-transparentize(#222226, 0.6); ++ background-color: #ececf0; } + .popup-menu-item:checked { + border-radius: 12px 12px 0 0 !important; } + .popup-menu-item .toggle-switch:ltr { + margin-left: 4px; } + .popup-menu-item .toggle-switch:rtl { + margin-right: 4px; } + +.popup-ornamented-menu-item:ltr { + padding-left: 6px; } + +.popup-ornamented-menu-item:rtl { + padding-right: 6px; } + +.popup-inactive-menu-item { - color: #282828; } ++ color: #222226; } + .popup-inactive-menu-item:insensitive { - color: #7a7a7a; } ++ color: #78787b; } + +.popup-menu-arrow, +.popup-menu-icon { + icon-size: 1.091em; } + +.popup-sub-menu { + border-radius: 0 0 13px 13px; + margin-bottom: 6px; + border: 1px solid transparent; - background-color: #cacaca; } ++ background-color: #cacad4; } + .popup-sub-menu .popup-menu-item { + border-radius: 0; + border-top-width: 0; + background-color: transparent; + border-color: transparent; + box-shadow: none; } + .popup-sub-menu .popup-menu-item:insensitive { + background-color: transparent !important; } - .popup-sub-menu .popup-menu-item:hover { - color: #282828; - background-color: st-darken(st-mix(#282828, #cacaca, 12%), 4%); } + .popup-sub-menu .popup-menu-item:active { - color: #282828; - background-color: st-darken(st-mix(#282828, #cacaca, 12%), 9%); } ++ color: #222226; ++ background-color: st-darken(#cacad4, 9%); } + .popup-sub-menu .popup-menu-item:active:hover { - background-color: st-darken(st-darken(st-mix(#282828, #cacaca, 12%), 9%), 4%); } ++ background-color: st-darken(st-darken(#cacad4, 9%), 7%); } + .popup-sub-menu .popup-menu-item:active:focus { - background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, #cacaca, 12%), 9%), 5%); } - .popup-sub-menu .popup-menu-item:selected, .popup-sub-menu .popup-menu-item:checked { - color: #282828; - background-color: st-darken(st-mix(#282828, #cacaca, 12%), 8%); } - .popup-sub-menu .popup-menu-item:selected:hover, .popup-sub-menu .popup-menu-item:checked:hover { - background-color: st-darken(st-darken(st-mix(#282828, #cacaca, 12%), 8%), 4%); } - .popup-sub-menu .popup-menu-item:selected:active, .popup-sub-menu .popup-menu-item:checked:active { - background-color: st-darken(st-darken(st-mix(#282828, #cacaca, 12%), 8%), 9%); } ++ background-color: st-mix(-st-accent-color, st-darken(#cacad4, 9%), 5%); } ++ .popup-sub-menu .popup-menu-item:hover, .popup-sub-menu .popup-menu-item:selected, .popup-sub-menu .popup-menu-item:checked { ++ color: #222226; ++ background-color: st-darken(#cacad4, 7%); } + .popup-sub-menu .popup-menu-item:insensitive { - color: st-transparentize(#282828, 0.6); - background-color: st-lighten(st-mix(#282828, #cacaca, 12%), 3%); } ++ color: st-transparentize(#222226, 0.6); ++ background-color: #cacad4; } + .popup-sub-menu .popup-menu-item:last-child { + border-radius: 0 0 12px 12px; + border-bottom-width: 0; } + .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:hover, .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:focus { + border-radius: 0; } + .popup-sub-menu .popup-menu-section:last-child .popup-menu-item:last-child { + border-radius: 0 0 12px 12px; } + +.popup-menu-ornament { + icon-size: 1.091em !important; + width: 1.091em; } + +.popup-separator-menu-item { + border: none !important; } + .popup-separator-menu-item .popup-separator-menu-item-separator { + height: 1px; - background-color: rgba(40, 40, 40, 0.15); } ++ background-color: rgba(34, 34, 38, 0.15); } + .popup-sub-menu .popup-separator-menu-item { + background-color: transparent; } + .popup-sub-menu .popup-separator-menu-item:ltr { + margin-right: 2.5em; } + .popup-sub-menu .popup-separator-menu-item:rtl { + margin-left: 2.5em; } + .popup-sub-menu .popup-separator-menu-item .popup-separator-menu-item-separator { - background-color: rgba(40, 40, 40, 0.15); } ++ background-color: rgba(34, 34, 38, 0.15); } + +.background-menu { + -boxpointer-gap: 0px; + -arrow-rise: 0px; } + +.app-menu { + max-width: 27.25em; } + .app-menu .popup-inactive-menu-item:first-child > StLabel:ltr { + margin-right: 8px; } + .app-menu .popup-inactive-menu-item:first-child > StLabel:rtl { + margin-left: 8px; } + +/* Date/Time Menu */ +#calendarArea { + padding: 4px; } + +.datemenu-popover { + border-radius: 30px; } + +.datemenu-calendar-column { + spacing: 6px; } + .datemenu-calendar-column:ltr { + margin-left: 6px; } + .datemenu-calendar-column:rtl { + margin-right: 6px; } + .datemenu-calendar-column .datemenu-displays-box { + spacing: 6px; } + +.datemenu-today-button { + padding: 9px; } + .datemenu-today-button .day-label { + font-weight: bold; } + +.calendar { + margin-top: 0; + padding: 0; } + .calendar .calendar-month-header .calendar-change-month-back StIcon, + .calendar .calendar-month-header .calendar-change-month-forward StIcon { + icon-size: 1.091em; } + .calendar .calendar-month-header .calendar-month-label { - color: #282828 !important; ++ color: #222226 !important; + padding: 8px 0; + width: 10em; + border-radius: 999px; + text-align: center; } + .calendar .calendar-month-header .pager-button { + height: 2.6em; + width: 2.6em; + padding: 0; } + .calendar .calendar-day { + border-radius: 999px; + height: 3em; + width: 3em; + margin: 2px; + padding: 0; + font-weight: bold; + text-align: center; } + .calendar .calendar-day.calendar-weekend { - color: #7a7a7a; } ++ color: #78787b; } + .calendar .calendar-day.calendar-other-month { - color: rgba(40, 40, 40, 0.5); ++ color: rgba(34, 34, 38, 0.5); + font-weight: normal; } + .calendar .calendar-day.calendar-other-month.calendar-weekend { - color: rgba(40, 40, 40, 0.5); } ++ color: rgba(34, 34, 38, 0.5); } + .calendar .calendar-day.calendar-today { + color: -st-accent-fg-color !important; } + .calendar .calendar-day.calendar-today.calendar-day-with-events { + background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg") !important; } + .calendar .calendar-day.calendar-day-with-events { + background-image: url("resource:///org/gnome/shell/theme/calendar-today-light.svg"); + background-size: contain; } + .calendar .calendar-day-heading { + font-weight: bold; + text-align: center; + margin: 4px; + padding: 3px 6px; + border-radius: 8px; } + .calendar .calendar-week-number { + font-weight: bold; + font-feature-settings: "tnum"; + text-align: center; + margin: 6px; + padding: 0 6px; + border-radius: 4px; - background-color: rgba(122, 122, 122, 0.2); - color: #7a7a7a; } ++ background-color: rgba(120, 120, 123, 0.2); ++ color: #78787b; } + +.events-button .events-box .events-title { - color: #7a7a7a; ++ color: #78787b; + padding-bottom: 6px; } + +.events-button .events-box .events-list { + spacing: 6px; } + .events-button .events-box .events-list .event-box { + spacing: 6px; + border-radius: 8px; } + .events-button .events-box .events-list .event-box .event-time { - color: #7a7a7a; } ++ color: #78787b; } + .events-button .events-box .events-list .event-placeholder { - color: #7a7a7a; ++ color: #78787b; + font-style: italic; } + +.world-clocks-button .world-clocks-header { - color: #7a7a7a; } ++ color: #78787b; } + .world-clocks-button .world-clocks-header.no-world-clocks { - color: #282828; } ++ color: #222226; } + +.world-clocks-button .world-clocks-grid { + spacing-rows: 6px; + spacing-columns: 12px; } + .world-clocks-button .world-clocks-grid .world-clocks-time { + font-weight: bold; } + .world-clocks-button .world-clocks-grid .world-clocks-time:ltr { + text-align: right; } + .world-clocks-button .world-clocks-grid .world-clocks-time:rtl { + text-align: left; } + .world-clocks-button .world-clocks-grid .world-clocks-timezone { - color: #7a7a7a; } ++ color: #78787b; } + +.weather-button .weather-box { + spacing: 6px; } + .weather-button .weather-box .weather-header-box { + spacing: 6px; } + .weather-button .weather-box .weather-header-box .weather-header { - color: #7a7a7a; } ++ color: #78787b; } + .weather-button .weather-box .weather-header-box .weather-header.no-location { - color: #282828; } ++ color: #222226; } + .weather-button .weather-box .weather-header-box .weather-header.location { + font-weight: normal; } + .weather-button .weather-box .weather-grid { + spacing-rows: 6px; + spacing-columns: 12px; } + .weather-button .weather-box .weather-grid .weather-forecast-time { + padding-top: 6px; + padding-bottom: 6px; } + .weather-button .weather-box .weather-grid .weather-forecast-icon { + icon-size: 2.182em; + margin-bottom: 4px; } + .weather-button .weather-box .weather-grid .weather-forecast-temp { + font-weight: bold; } + +/* Message List */ +.message-list { + width: 29em; - border: solid rgba(40, 40, 40, 0.15); } ++ border: solid rgba(34, 34, 38, 0.15); } + .message-list:ltr { + margin-left: 0; + margin-right: 4px; + padding-right: 6px; + border-right-width: 1px; } + .message-list:rtl { + margin-right: 0; + margin-left: 4px; + padding-left: 6px; + border-left-width: 1px; } + .message-list .message-list-placeholder { - color: rgba(40, 40, 40, 0.25); } ++ color: rgba(34, 34, 38, 0.45); } + .message-list .message-list-placeholder > StIcon { + icon-size: 96px; + margin-bottom: 12px; + -st-icon-style: symbolic; } + +.message-list-sections { + spacing: 12px; } + .message-list-sections:ltr { + margin-right: 12px; } + .message-list-sections:rtl { + margin-left: 12px; } + +.message-list-section, +.message-list-section-list { + spacing: 12px; } + +.message-list-controls { + padding: 12px; + padding-bottom: 6px; + spacing: 6px; } + .message-list-controls .dnd-button { + border-width: 2px; + border-color: transparent; + border-radius: 32px; + border-style: solid; } + .message-list-controls .dnd-button:focus { + border-color: st-transparentize(-st-accent-color, 0.4); } + +.message { + padding: 6px; + margin: 0; + border-radius: 16px; } + .message .message-header { + spacing: 6px; - color: #7a7a7a; ++ color: #78787b; + padding: 0 6px; } + .message .message-header:ltr { + padding-right: 0; } + .message .message-header:rtl { + padding-left: 0; } + .message .message-header .message-source-icon { + icon-size: 1.091em; + -st-icon-style: symbolic; } + .message .message-header .message-header-content { + spacing: 6px; + min-height: 1.637em; + padding-bottom: 6px; } + .message .message-header .message-header-content .message-source-title { + font-weight: bold; } + .message .message-header .message-header-content .event-time { - color: #7a7a7a; ++ color: #78787b; + padding-bottom: 0.068em; } + .message .message-header .message-header-content .event-time:ltr { + text-align: right; } + .message .message-header .message-header-content .event-time:rtl { + text-align: left; } + .message .message-header .message-expand-button, + .message .message-header .message-close-button { + border-radius: 999px; - color: #282828; } ++ color: #222226; } + .message .message-header .message-expand-button { + padding: 6px; } + .message .message-header .message-close-button { + margin: 3px; + padding: 4px; } + .message .message-box { + padding: 6px; + margin-top: 0; + spacing: 6px; } + .message .message-box .message-icon { + icon-size: 48px; } + .message .message-box .message-icon:ltr { + margin-right: 6px; } + .message .message-box .message-icon:rtl { + margin-left: 6px; } + .message .message-box .message-icon.message-themed-icon { + border-radius: 999px; - background-color: rgba(40, 40, 40, 0.07); ++ background-color: rgba(34, 34, 38, 0.07); + icon-size: 1.091em; + min-width: 48px; + min-height: 48px; } + .message .message-box:first-child { + margin-top: 12px; } + .message .message-box .message-content { + spacing: 4px; } + .message .message-box .message-content .message-title { + font-weight: bold; } + .message .message-action-bin { + padding: 4px; + spacing: 6px; } + .message .message-action-bin * { + margin: 0 4px; } + .message .message-action-bin *:first-child:ltr { + margin-left: 0; } + .message .message-action-bin *:first-child:rtl { + margin-right: 0; } + .message .message-action-bin *:last-child:ltr { + margin-right: 0; } + .message .message-action-bin *:last-child:rtl { + margin-left: 0; } + +.url-highlighter { + link-color: st-darken(-st-accent-color, 10%); } + +/* Media Controls */ +.message-media-control { + padding: 0 18px; + border-radius: 8px; - color: #282828; ++ color: #222226; + border: 1px solid transparent; } + .message-media-control:hover { - background-color: #ebebeb; - color: #282828; } ++ background-color: #efeff2; ++ color: #222226; } + .message-media-control:active { - background-color: #e6e6e6; - color: #282828; } ++ background-color: #e9e9ed; ++ color: #222226; } + .message-media-control:insensitive { - color: #878787; } ++ color: #858588; } + .message-media-control StIcon { + icon-size: 16px; } + +.media-message .message-icon { + border-radius: 8px !important; } + .media-message .message-icon.message-themed-icon { + icon-size: 32px !important; } + +.candidate-popup-content { + padding: 6px; + spacing: 6px; + border-radius: 12px; } + +.candidate-index { + padding: 0; + padding-right: 6px; - color: #7a7a7a; } ++ color: #78787b; } + +.candidate-box { + padding: 6px 12px 6px 12px; + border-radius: 8px; } + .candidate-box:selected { + background-color: -st-accent-color; + color: -st-accent-fg-color; } + .candidate-box:hover { - background-color: #dedede; - color: #111111; } ++ background-color: #e1e1e7; ++ color: #0c0c0e; } + +.candidate-page-button-box { + height: 2em; } + .vertical .candidate-page-button-box { + padding-top: 12px; } + .horizontal .candidate-page-button-box { + padding-left: 12px; } + +.candidate-page-button { + padding: 6px; } + .candidate-page-button StIcon { + icon-size: 16px; } + +.candidate-page-button-previous { + border-radius: 8px 0px 0px 8px; + border-right-width: 0; + box-shadow: none; } + +.candidate-page-button-next { + border-radius: 0px 8px 8px 0px; + box-shadow: none; } + +/* Notifications & Message Tray */ +.notification-banner { + min-height: 64px; + width: 34em; + box-shadow: 0 2px 4px 2px rgba(0, 0, 0, 0.05); + border-radius: 16px; + margin: 4px; } + +.notification-buttons-bin { + spacing: 0; } + +/* Modal Dialogs */ +.modal-dialog { - background-color: whitesmoke; ++ background-color: #fafafb; + border-radius: 18px; + padding: 24px; + spacing: 18px; + box-shadow: 0 12px 8px 12px rgba(0, 0, 0, 0.03); } + .modal-dialog .modal-dialog-content-box { + padding-top: 12px; + spacing: 18px; + max-width: 28em; } + .modal-dialog .modal-dialog-button-box { + padding-top: 6px; } + +.dialog-list { + spacing: 18px; } + .dialog-list .dialog-list-title { + text-align: center; } + .dialog-list .dialog-list-scrollview { + max-height: 200px; } + .dialog-list .dialog-list-box { + spacing: 1em; } + .dialog-list .dialog-list-box .dialog-list-item { + spacing: 1em; } + .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-title { + font-weight: bold; } + .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description { - color: #1b1b1b; } ++ color: #161619; } + +/* End Session Dialog */ +.end-session-dialog { + width: 24em; } + .end-session-dialog .end-session-dialog-battery-warning, + .end-session-dialog .dialog-list-title { - color: #f5c211; - background-color: rgba(245, 194, 17, 0.1); ++ color: #e5a50a; ++ background-color: rgba(229, 165, 10, 0.1); + padding: 9px; + border-radius: 8px; + margin: 4px 0; } + +/* Message Dialog */ +.message-dialog-content { + spacing: 18px; } + .message-dialog-content .message-dialog-title { + text-align: center; } + .message-dialog-content .message-dialog-description { + text-align: center; } + +/* Run Dialog */ +.run-dialog { + width: 24em; + padding-bottom: 6px; } + .run-dialog .run-dialog-entry { + padding: 12px 9px; } + .run-dialog .run-dialog-description { + color: black; } + +/* Password or Authentication Dialog */ +.prompt-dialog { + width: 28em; } + .prompt-dialog .prompt-dialog-password-grid { + spacing-rows: 8px; + spacing-columns: 4px; } + .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry { + width: auto; } + .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry:ltr { + margin-left: 20px; } + .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry:rtl { + margin-right: 20px; } + .prompt-dialog .prompt-dialog-password-layout { + spacing: 8px; } + .prompt-dialog .prompt-dialog-password-entry { + width: 20em; + padding: 12px 9px; } + .prompt-dialog .prompt-dialog-error-label, + .prompt-dialog .prompt-dialog-info-label, + .prompt-dialog .prompt-dialog-null-label { + text-align: center; } + .prompt-dialog .prompt-dialog-error-label { - color: #f5c211; } ++ color: #e5a50a; } + +/* Polkit Dialog */ +.polkit-dialog-user-layout { + text-align: center; + spacing: 8px; + margin-bottom: 6px; } + .polkit-dialog-user-layout .polkit-dialog-user-root-label { - color: #f5c211; } ++ color: #e5a50a; } + +/* Audio selection dialog */ +.audio-device-selection-dialog { + min-width: 24em; } + .audio-device-selection-dialog .audio-selection-box { + spacing: 12px; } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device { + color: #ffffff; - background-color: #353535; } ++ background-color: #2e2e33; ++ background-color: transparent; } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:focus { + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, rgba(46, 46, 51, 0.25), 5%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(#2e2e33, 7%), 5%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:hover { + color: #ffffff; - background-color: st-lighten(#353535, 7%); } ++ background-color: st-lighten(#2e2e33, 7%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active { + color: #ffffff; - background-color: st-lighten(#353535, 9%); } ++ background-color: st-lighten(#2e2e33, 9%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active:hover { - background-color: st-lighten(st-lighten(#353535, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#2e2e33, 9%), 7%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(#2e2e33, 9%), 5%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked { + color: #ffffff; - background-color: st-lighten(#353535, 8%); } ++ background-color: st-lighten(#2e2e33, 8%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted:hover, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected:hover, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked:hover { - background-color: st-lighten(st-lighten(#353535, 8%), 7%); } ++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 7%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted:active, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected:active, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked:active { - background-color: st-lighten(st-lighten(#353535, 8%), 9%); } ++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 9%); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:insensitive { + color: st-transparentize(#ffffff, 0.6); - background-color: #353535; } ++ background-color: #2e2e33; } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device:drop { + background-color: st-transparentize(-st-accent-color, 0.8); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device .audio-selection-device-box { + padding: 12px; + spacing: 12px; } + .audio-device-selection-dialog .audio-selection-box .audio-selection-device .audio-selection-device-icon { + icon-size: 64px; } + +/* Welcome dialog */ +.welcome-dialog-image { + background-image: url("resource:///org/gnome/shell/theme/gnome-shell-start.svg"); + background-size: contain; + /* Reasonable maximum dimensions */ + height: 300px; + width: 300px; } + +/* Access portal dialog */ +.access-dialog { + text-align: center; } + +/* OSD */ +.osd-window { + text-align: center; + font-weight: bold; + spacing: 12px; + padding: 12px 18px; + margin-bottom: 4em; } + .osd-window > * { + spacing: 8px; } + .osd-window StIcon { + icon-size: 32px; } + .osd-window StLabel:ltr { + margin-right: 6px; } + .osd-window StLabel:rtl { + margin-left: 6px; } + .osd-window .level { + margin-bottom: 4px; + min-width: 160px; + -barlevel-height: 6px; + -barlevel-background-color: rgba(255, 255, 255, 0.3); + -barlevel-active-background-color: #ffffff; + -barlevel-overdrive-color: #e01b24; + -barlevel-overdrive-separator-width: 3px; } + .osd-window .level:first-child { + margin-bottom: 0; } + .osd-window .level:ltr { + margin-right: 6px; } + .osd-window .level:rtl { + margin-left: 6px; } + - .osd-monitor-label { ++.osd-monitor-label, .osd-break-countdown-label { + background-color: -st-accent-color; + color: -st-accent-fg-color; + border-radius: 16px; + font-size: 3em; + font-weight: bold; + font-feature-settings: "tnum"; + margin: 12px; + padding: 12px; + text-align: center; + min-width: 1.5em; } + +/* Pad OSD */ +.pad-osd-window { + padding: 32px; + background-color: rgba(0, 0, 0, 0.8); } + .pad-osd-window .pad-osd-title-box { + spacing: 12px; } + .pad-osd-window .pad-osd-title-menu-box { + spacing: 6px; } + +.combo-box-label { + width: 15em; } + +/* App Switcher */ +.switcher-popup { + padding: 0; + spacing: 24px; } + +.switcher-list { + padding: 12px; + border-radius: 28px; + box-shadow: 0 8px 8px 0 rgba(0, 0, 0, 0.05); } + .switcher-list .switcher-list-item-container { + spacing: 12px; } + .switcher-list .item-box { + color: #ffffff; - background-color: #353535; } ++ background-color: #2e2e33; ++ background-color: transparent; } + .switcher-list .item-box:focus { + color: #ffffff; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); } ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, rgba(46, 46, 51, 0.25), 5%); } + .switcher-list .item-box:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(#2e2e33, 7%), 5%); } + .switcher-list .item-box:hover { + color: #ffffff; - background-color: st-lighten(#353535, 7%); } ++ background-color: st-lighten(#2e2e33, 7%); } + .switcher-list .item-box:active { + color: #ffffff; - background-color: st-lighten(#353535, 9%); } ++ background-color: st-lighten(#2e2e33, 9%); } + .switcher-list .item-box:active:hover { - background-color: st-lighten(st-lighten(#353535, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#2e2e33, 9%), 7%); } + .switcher-list .item-box:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(#2e2e33, 9%), 5%); } + .switcher-list .item-box:highlighted, .switcher-list .item-box:selected, .switcher-list .item-box:checked { + color: #ffffff; - background-color: st-lighten(#353535, 8%); } ++ background-color: st-lighten(#2e2e33, 8%); } + .switcher-list .item-box:highlighted:hover, .switcher-list .item-box:selected:hover, .switcher-list .item-box:checked:hover { - background-color: st-lighten(st-lighten(#353535, 8%), 7%); } ++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 7%); } + .switcher-list .item-box:highlighted:active, .switcher-list .item-box:selected:active, .switcher-list .item-box:checked:active { - background-color: st-lighten(st-lighten(#353535, 8%), 9%); } ++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 9%); } + .switcher-list .item-box:insensitive { + color: st-transparentize(#ffffff, 0.6); - background-color: #353535; } ++ background-color: #2e2e33; } + .switcher-list .item-box:drop { + background-color: st-transparentize(-st-accent-color, 0.8); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); } + .switcher-list .item-box:hover { + background: none; } + .switcher-list .item-box:selected { + background-color: rgba(255, 255, 255, 0.2); } + .switcher-list .separator { + width: 1px; - background: rgba(40, 40, 40, 0.15); } ++ background: rgba(34, 34, 38, 0.15); } + .switcher-list .thumbnail-box { + padding: 2px; + spacing: 6px; } + .switcher-list .thumbnail { + width: 256px; + border-radius: 8px; } + +.switcher-arrow { + border-color: rgba(255, 255, 255, 0.8); + color: rgba(255, 255, 255, 0.8); } + .switcher-arrow:highlighted { + border-color: #ffffff; + color: #ffffff; } + +.input-source-switcher-symbol { + font-size: 34pt; + width: 96px; + height: 96px; } + +.cycler-highlight { + border: 5px solid -st-accent-color; } + +/* Workspace Switcher */ +.workspace-switcher { + margin-bottom: 4em; + spacing: 12px; + padding: 12px 18px; } + +.ws-switcher-indicator { + background-color: rgba(255, 255, 255, 0.5); + padding: 2.6666666667px; + margin: 13.3333333333px; + border-radius: 32px; } + .ws-switcher-indicator:active { + background-color: #ffffff; + padding: 5.3333333333px; + margin: 10.6666666667px; } + +.screenshot-ui-panel { + border-radius: 32px; + padding: 18px; + padding-bottom: 12px; + margin-bottom: 4em; + spacing: 12px; } + +.screenshot-ui-close-button { + padding: 6px !important; + margin-top: 12px; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05); } + .screenshot-ui-close-button.left { + margin-left: 12px; } + .screenshot-ui-close-button.right { + margin-right: 12px; } + +.screenshot-ui-type-button { + min-width: 48px; + padding: 12px 18px; + border-radius: 14px; } + .screenshot-ui-type-button .icon-label-button-container { + spacing: 0.409em; } + .screenshot-ui-type-button .icon-label-button-container > StIcon { + icon-size: 32px; } + +.screenshot-ui-capture-button { + width: 32px; + height: 32px; + border-radius: 999px; + border: 4px #ffffff; + padding: 4px; } + .screenshot-ui-capture-button .screenshot-ui-capture-button-circle { + background-color: #ffffff; + transition-duration: 200ms; + border-radius: 999px; } + .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:hover, .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:focus { - background-color: #dedede; } ++ background-color: #e1e1e7; } + .screenshot-ui-capture-button:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:focus .screenshot-ui-capture-button-circle { + background-color: #cccccc; } + .screenshot-ui-capture-button:active .screenshot-ui-capture-button-circle { + background-color: gray; } + .screenshot-ui-capture-button:cast .screenshot-ui-capture-button-circle { + background-color: #c01c28; } + .screenshot-ui-capture-button:cast:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:cast:focus .screenshot-ui-capture-button-circle { + background-color: #d61f2d; } + .screenshot-ui-capture-button:cast:active .screenshot-ui-capture-button-circle { + background-color: #a11722; } + +.screenshot-ui-shot-cast-container { + background-color: rgba(255, 255, 255, 0.1); + border-radius: 999px; + padding: 3px; + spacing: 3px; } + +.screenshot-ui-shot-cast-button { + padding: 6px 12px; + background-color: transparent; + border-radius: 999px; } + .screenshot-ui-shot-cast-button > StIcon { + icon-size: 16px; } + .screenshot-ui-shot-cast-button:hover, .screenshot-ui-shot-cast-button:focus { + background-color: rgba(255, 255, 255, 0.2); } + .screenshot-ui-shot-cast-button:active { + background-color: rgba(255, 255, 255, 0.5); } + .screenshot-ui-shot-cast-button:checked { + background-color: #ffffff; - color: #353535; } ++ color: #2e2e33; } + .screenshot-ui-shot-cast-button:insensitive { + color: rgba(255, 255, 255, 0.5); } + +.screenshot-ui-area-indicator-shade { + background-color: rgba(0, 0, 0, 0.3); } + +.screenshot-ui-area-selector .screenshot-ui-area-indicator-shade { + background-color: rgba(0, 0, 0, 0.5); } + +.screenshot-ui-area-selector .screenshot-ui-area-indicator-selection { + border: 2px white; } + +.screenshot-ui-area-selector-handle { + border-radius: 999px; + background-color: white; + box-shadow: 0 1px 3px 2px rgba(0, 0, 0, 0.05); + width: 24px; + height: 24px; } + +.screenshot-ui-window-selector { - background-color: #282828; } ++ background-color: #222226; } + .screenshot-ui-window-selector .screenshot-ui-window-selector-window-container { + margin: 100px; } + .screenshot-ui-window-selector:primary-monitor .screenshot-ui-window-selector-window-container { + margin-bottom: 200px; } + +.screenshot-ui-window-selector-window-border { + transition-duration: 200ms; + border-radius: 16px; + border: 6px transparent; } + +.screenshot-ui-window-selector-check { + transition-duration: 200ms; + color: transparent; + border-radius: 999px; + border-width: 12px; + icon-size: 24px; } + +.screenshot-ui-window-selector-window:hover .screenshot-ui-window-selector-window-border { + border-color: st-darken(-st-accent-color, 15%); } + +.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-window-border { + border-color: -st-accent-color; + background-color: st-transparentize(-st-accent-color, 0.8); } + +.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-check { + color: -st-accent-fg-color; + background-color: -st-accent-color; } + +.screenshot-ui-screen-selector { + transition-duration: 200ms; + background-color: rgba(0, 0, 0, 0.5); } + .screenshot-ui-screen-selector:hover { + background-color: rgba(0, 0, 0, 0.3); } + .screenshot-ui-screen-selector:active { + background-color: rgba(0, 0, 0, 0.7); } + .screenshot-ui-screen-selector:checked { + background-color: transparent; + border: 2px white; } + +.screenshot-ui-tooltip { + text-align: center; + -y-offset: 24px; } + +/* Top Bar */ +#panel { - background-color: whitesmoke; ++ background-color: #fafafb; + font-weight: bold; + height: 2.2em; + transition-duration: 250ms; } + #panel .panel-button { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; - color: #282828; ++ color: #222226; + box-shadow: inset 0 0 0 100px transparent; + -natural-hpadding: 12px; + -minimum-hpadding: 6px; } + #panel .panel-button:focus, #panel .panel-button:hover { - box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.17); } ++ box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.17); } + #panel .panel-button:active, #panel .panel-button:checked { - box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.28); } ++ box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.28); } + #panel .panel-button:active:hover, #panel .panel-button:checked:hover { - box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.32); } ++ box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.32); } + #panel .panel-button .system-status-icon { + icon-size: 1.091em; + padding: 0 6px; + margin: 0 4px; } + #panel .panel-button .app-menu-icon { + -st-icon-style: symbolic; } + #panel .panel-button .panel-status-menu-box, + #panel .panel-button .panel-status-indicators-box { + spacing: 4px; } + #panel .panel-button .panel-status-menu-box > .system-status-icon, + #panel .panel-button .panel-status-indicators-box > .system-status-icon { + padding: 0; } + #panel .panel-button#panelActivities StBoxLayout { + padding: 0 0.2045em; + spacing: 5px; } + #panel .panel-button#panelActivities .workspace-dot { + border-radius: 999px; + min-width: 0.5455em; + min-height: 0.5455em; - background-color: #282828; } ++ background-color: #222226; } + #panel .panel-button.screen-recording-indicator StBoxLayout, #panel .panel-button.screen-sharing-indicator StBoxLayout { + spacing: 0.409em; } + #panel .panel-button.screen-recording-indicator StIcon, #panel .panel-button.screen-sharing-indicator StIcon { + icon-size: 1.091em; } + #panel .panel-button.screen-recording-indicator { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; - color: whitesmoke; ++ color: #fafafb; + box-shadow: inset 0 0 0 100px #c01c28; } + #panel .panel-button.screen-recording-indicator:focus, #panel .panel-button.screen-recording-indicator:hover { + box-shadow: inset 0 0 0 100px #aa1923; } + #panel .panel-button.screen-recording-indicator:active, #panel .panel-button.screen-recording-indicator:checked { + box-shadow: inset 0 0 0 100px #981620; } + #panel .panel-button.screen-recording-indicator:active:hover, #panel .panel-button.screen-recording-indicator:checked:hover { + box-shadow: inset 0 0 0 100px #8f151e; } + #panel .panel-button.screen-sharing-indicator { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; - color: whitesmoke; ++ color: #fafafb; + box-shadow: inset 0 0 0 100px #e66100; } + #panel .panel-button.screen-sharing-indicator:focus, #panel .panel-button.screen-sharing-indicator:hover { + box-shadow: inset 0 0 0 100px #cd5600; } + #panel .panel-button.screen-sharing-indicator:active, #panel .panel-button.screen-sharing-indicator:checked { + box-shadow: inset 0 0 0 100px #b84e00; } + #panel .panel-button.screen-sharing-indicator:active:hover, #panel .panel-button.screen-sharing-indicator:checked:hover { + box-shadow: inset 0 0 0 100px #ae4900; } + #panel .panel-button.clock-display { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; - color: #282828; ++ color: #222226; + box-shadow: inset 0 0 0 100px transparent; + background: none !important; + box-shadow: none !important; + border: none !important; } + #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:hover { - box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.17); } ++ box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.17); } + #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:checked { - box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.28); } ++ box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.28); } + #panel .panel-button.clock-display:active:hover, #panel .panel-button.clock-display:checked:hover { - box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.32); } ++ box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.32); } + #panel .panel-button.clock-display .clock { + transition-duration: 150ms; + border: 3px solid transparent; + border-radius: 999px; } + #panel .panel-button.clock-display:focus .clock, #panel .panel-button.clock-display:hover .clock { - box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.17); } ++ box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.17); } + #panel .panel-button.clock-display:active .clock, #panel .panel-button.clock-display:checked .clock { - box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.28); } ++ box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.28); } + #panel .panel-button.clock-display:active .clock:hover, #panel .panel-button.clock-display:checked .clock:hover { - box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.32); } ++ box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.32); } + #panel .panel-button.clock-display .messages-indicator { + icon-size: 1.091em; } + #panel:overview, #panel.unlock-screen, #panel.login-screen { + background-color: transparent; } + #panel:overview .panel-button.screen-recording-indicator, #panel.unlock-screen .panel-button.screen-recording-indicator, #panel.login-screen .panel-button.screen-recording-indicator { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; - color: whitesmoke; ++ color: #fafafb; + box-shadow: inset 0 0 0 100px #c01c28; } + #panel:overview .panel-button.screen-recording-indicator:focus, #panel:overview .panel-button.screen-recording-indicator:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:focus, #panel.unlock-screen .panel-button.screen-recording-indicator:hover, #panel.login-screen .panel-button.screen-recording-indicator:focus, #panel.login-screen .panel-button.screen-recording-indicator:hover { + box-shadow: inset 0 0 0 100px #aa1923; } + #panel:overview .panel-button.screen-recording-indicator:active, #panel:overview .panel-button.screen-recording-indicator:checked, #panel.unlock-screen .panel-button.screen-recording-indicator:active, #panel.unlock-screen .panel-button.screen-recording-indicator:checked, #panel.login-screen .panel-button.screen-recording-indicator:active, #panel.login-screen .panel-button.screen-recording-indicator:checked { + box-shadow: inset 0 0 0 100px #981620; } + #panel:overview .panel-button.screen-recording-indicator:active:hover, #panel:overview .panel-button.screen-recording-indicator:checked:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:active:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:checked:hover, #panel.login-screen .panel-button.screen-recording-indicator:active:hover, #panel.login-screen .panel-button.screen-recording-indicator:checked:hover { + box-shadow: inset 0 0 0 100px #8f151e; } + #panel:overview .panel-button.screen-sharing-indicator, #panel.unlock-screen .panel-button.screen-sharing-indicator, #panel.login-screen .panel-button.screen-sharing-indicator { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; - color: whitesmoke; ++ color: #fafafb; + box-shadow: inset 0 0 0 100px #e66100; } + #panel:overview .panel-button.screen-sharing-indicator:focus, #panel:overview .panel-button.screen-sharing-indicator:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:focus, #panel.unlock-screen .panel-button.screen-sharing-indicator:hover, #panel.login-screen .panel-button.screen-sharing-indicator:focus, #panel.login-screen .panel-button.screen-sharing-indicator:hover { + box-shadow: inset 0 0 0 100px #cd5600; } + #panel:overview .panel-button.screen-sharing-indicator:active, #panel:overview .panel-button.screen-sharing-indicator:checked, #panel.unlock-screen .panel-button.screen-sharing-indicator:active, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked, #panel.login-screen .panel-button.screen-sharing-indicator:active, #panel.login-screen .panel-button.screen-sharing-indicator:checked { + box-shadow: inset 0 0 0 100px #b84e00; } + #panel:overview .panel-button.screen-sharing-indicator:active:hover, #panel:overview .panel-button.screen-sharing-indicator:checked:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:active:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked:hover, #panel.login-screen .panel-button.screen-sharing-indicator:active:hover, #panel.login-screen .panel-button.screen-sharing-indicator:checked:hover { + box-shadow: inset 0 0 0 100px #ae4900; } + #panel.unlock-screen .panel-button, #panel.login-screen .panel-button { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; + color: #ffffff; + box-shadow: inset 0 0 0 100px transparent; } + #panel.unlock-screen .panel-button:focus, #panel.unlock-screen .panel-button:hover, #panel.login-screen .panel-button:focus, #panel.login-screen .panel-button:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); } + #panel.unlock-screen .panel-button:active, #panel.unlock-screen .panel-button:checked, #panel.login-screen .panel-button:active, #panel.login-screen .panel-button:checked { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); } + #panel.unlock-screen .panel-button:active:hover, #panel.unlock-screen .panel-button:checked:hover, #panel.login-screen .panel-button:active:hover, #panel.login-screen .panel-button:checked:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); } + #panel.unlock-screen .panel-button.clock-display, #panel.login-screen .panel-button.clock-display { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; + color: #ffffff; + box-shadow: inset 0 0 0 100px transparent; + background: none !important; + box-shadow: none !important; + border: none !important; } + #panel.unlock-screen .panel-button.clock-display:focus, #panel.unlock-screen .panel-button.clock-display:hover, #panel.login-screen .panel-button.clock-display:focus, #panel.login-screen .panel-button.clock-display:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); } + #panel.unlock-screen .panel-button.clock-display:active, #panel.unlock-screen .panel-button.clock-display:checked, #panel.login-screen .panel-button.clock-display:active, #panel.login-screen .panel-button.clock-display:checked { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); } + #panel.unlock-screen .panel-button.clock-display:active:hover, #panel.unlock-screen .panel-button.clock-display:checked:hover, #panel.login-screen .panel-button.clock-display:active:hover, #panel.login-screen .panel-button.clock-display:checked:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); } + #panel.unlock-screen .panel-button.clock-display .clock, #panel.login-screen .panel-button.clock-display .clock { + transition-duration: 150ms; + border: 3px solid transparent; + border-radius: 999px; } + #panel.unlock-screen .panel-button.clock-display:focus .clock, #panel.unlock-screen .panel-button.clock-display:hover .clock, #panel.login-screen .panel-button.clock-display:focus .clock, #panel.login-screen .panel-button.clock-display:hover .clock { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); } + #panel.unlock-screen .panel-button.clock-display:active .clock, #panel.unlock-screen .panel-button.clock-display:checked .clock, #panel.login-screen .panel-button.clock-display:active .clock, #panel.login-screen .panel-button.clock-display:checked .clock { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); } + #panel.unlock-screen .panel-button.clock-display:active .clock:hover, #panel.unlock-screen .panel-button.clock-display:checked .clock:hover, #panel.login-screen .panel-button.clock-display:active .clock:hover, #panel.login-screen .panel-button.clock-display:checked .clock:hover { + box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); } + #panel:overview .panel-button { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; - color: whitesmoke; ++ color: #fafafb; + box-shadow: inset 0 0 0 100px transparent; } + #panel:overview .panel-button:focus, #panel:overview .panel-button:hover { - box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.17); } ++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.17); } + #panel:overview .panel-button:active, #panel:overview .panel-button:checked { - box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.28); } ++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.28); } + #panel:overview .panel-button:active:hover, #panel:overview .panel-button:checked:hover { - box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.32); } ++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.32); } + #panel:overview .panel-button#panelActivities .workspace-dot { - background-color: whitesmoke; } ++ background-color: #fafafb; } + #panel:overview .panel-button.clock-display { + transition-duration: 150ms; + border: 3px solid transparent; + background-color: transparent; + border-radius: 999px; + font-weight: bold; - color: whitesmoke; ++ color: #fafafb; + box-shadow: inset 0 0 0 100px transparent; + background: none !important; + box-shadow: none !important; + border: none !important; } + #panel:overview .panel-button.clock-display:focus, #panel:overview .panel-button.clock-display:hover { - box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.17); } ++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.17); } + #panel:overview .panel-button.clock-display:active, #panel:overview .panel-button.clock-display:checked { - box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.28); } ++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.28); } + #panel:overview .panel-button.clock-display:active:hover, #panel:overview .panel-button.clock-display:checked:hover { - box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.32); } ++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.32); } + #panel:overview .panel-button.clock-display .clock { + transition-duration: 150ms; + border: 3px solid transparent; + border-radius: 999px; } + #panel:overview .panel-button.clock-display:focus .clock, #panel:overview .panel-button.clock-display:hover .clock { - box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.17); } ++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.17); } + #panel:overview .panel-button.clock-display:active .clock, #panel:overview .panel-button.clock-display:checked .clock { - box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.28); } ++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.28); } + #panel:overview .panel-button.clock-display:active .clock:hover, #panel:overview .panel-button.clock-display:checked .clock:hover { - box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.32); } ++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.32); } + #panel .panel-status-indicators-box, + #panel .panel-status-menu-box { + spacing: 2px; } + #panel .power-status.panel-status-indicators-box { + spacing: 0; } + #panel .privacy-indicator { + color: #e66100; } + +#appMenu { + spacing: 0.409em; } + #appMenu .label-shadow { + color: transparent; } + +#appMenu .panel-status-menu-box { + padding: 0 0.409em; + spacing: 0.409em; } + +.clock-display-box { + spacing: 2px; } + .clock-display-box .clock { + padding-left: 0.818em; + padding-right: 0.818em; } + +/* Activities Ripple */ +.ripple-box { + background-color: rgba(255, 255, 255, 0.2); + box-shadow: 0 0 2px 2px rgba(255, 255, 255, 0.2); + width: 52px; + height: 52px; + border-radius: 0 0 52px 0; } + .ripple-box:rtl { + border-radius: 0 0 0 52px; } + +.quick-settings { + padding: 18px; + border-radius: 36px; } + .quick-settings .icon-button, .quick-settings .login-dialog-button.cancel-button, .quick-settings .login-dialog-button.switch-user-button, .quick-settings .login-dialog-button.login-dialog-session-list-button, .quick-settings .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-settings .pager-button, .quick-settings .message .message-header .message-expand-button, .message .message-header .quick-settings .message-expand-button, + .quick-settings .message .message-header .message-close-button, + .message .message-header .quick-settings .message-close-button, .quick-settings .screenshot-ui-show-pointer-button, .quick-settings .button { + padding: 10.5px; } + +.quick-settings-grid { + spacing-rows: 12px; + spacing-columns: 12px; } + - .quick-toggle, .quick-menu-toggle { ++.quick-toggle, .quick-toggle-has-menu { + border-radius: 999px; + min-width: 12em; + max-width: 12em; - min-height: 3.273em; - border: none; } ++ min-height: 3.273em; } + +.quick-toggle { - background-color: none; + /* Move padding into the box; this is to allow menu arrows + to extend to the border */ } + .quick-toggle > StBoxLayout { + spacing: 9px; } + .quick-toggle.button { + padding: 0; } + .quick-toggle > StBoxLayout { + padding: 0 12px; } + .quick-toggle:ltr > StBoxLayout { + padding-left: 15px; } + .quick-toggle:rtl > StBoxLayout { + padding-right: 15px; } - .quick-toggle .quick-toggle-title { - font-weight: bold; } - .quick-toggle StBoxLayout > .quick-toggle-subtitle { ++ .quick-toggle .quick-toggle-subtitle { + font-weight: normal; } + .quick-toggle .quick-toggle-icon { + icon-size: 1.091em; } + - .quick-menu-toggle .quick-toggle { ++.quick-toggle-has-menu .quick-toggle { + min-width: auto; + max-width: auto; } - .quick-menu-toggle .quick-toggle:ltr { ++ .quick-toggle-has-menu .quick-toggle:ltr { + border-radius: 999px 0 0 999px; } - .quick-menu-toggle .quick-toggle:ltr > StBoxLayout { - padding-right: 0.6135em; } - .quick-menu-toggle .quick-toggle:rtl { ++ .quick-toggle-has-menu .quick-toggle:ltr > StBoxLayout { ++ padding-right: 0.6135em; } ++ .quick-toggle-has-menu .quick-toggle:rtl { + border-radius: 0 999px 999px 0; } - .quick-menu-toggle .quick-toggle:rtr > StBoxLayout { - padding-left: 0.6135em; } - .quick-menu-toggle .quick-toggle:ltr:last-child { ++ .quick-toggle-has-menu .quick-toggle:rtl > StBoxLayout { ++ padding-left: 0.6135em; } ++ .quick-toggle-has-menu .quick-toggle:ltr:last-child { + border-radius: 999px; } - .quick-menu-toggle .quick-toggle:rtl:last-child { ++ .quick-toggle-has-menu .quick-toggle:rtl:last-child { + border-radius: 999px; } + - .quick-menu-toggle .quick-toggle-arrow { - padding: 0.409em 0.71575em; - border-width: 0; - border-color: rgba(40, 40, 40, 0.25); } - .quick-menu-toggle .quick-toggle-arrow:checked { - border-color: st-darken(-st-accent-color, 15%); } - .quick-menu-toggle .quick-toggle-arrow:ltr { - border-radius: 0 999px 999px 0; - border-left-width: 1px; } - .quick-menu-toggle .quick-toggle-arrow:rtl { - border-radius: 999px 0 0 999px; - border-right-width: 1px; } ++.quick-toggle-has-menu .quick-toggle-menu-button { ++ padding: 0.409em 0.71575em; } ++ .quick-toggle-has-menu .quick-toggle-menu-button:ltr { ++ border-radius: 0 999px 999px 0; } ++ .quick-toggle-has-menu .quick-toggle-menu-button:rtl { ++ border-radius: 999px 0 0 999px; } ++ ++.quick-toggle-has-menu .quick-toggle-separator { ++ width: 1px; } ++ ++.quick-toggle-has-menu .quick-toggle-menu-button { ++ color: #222226; ++ background-color: st-mix(#222226, #ececf0, 12%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:focus { ++ color: #222226; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, st-mix(#222226, #ececf0, 12%), 5%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:focus:hover { ++ background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #ececf0, 12%), 4%), 5%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:hover { ++ color: #222226; ++ background-color: st-darken(st-mix(#222226, #ececf0, 12%), 4%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:active { ++ color: #222226; ++ background-color: st-darken(st-mix(#222226, #ececf0, 12%), 9%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:active:hover { ++ background-color: st-darken(st-darken(st-mix(#222226, #ececf0, 12%), 9%), 4%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:active:focus { ++ background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #ececf0, 12%), 9%), 5%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked { ++ color: -st-accent-fg-color; ++ background-color: st-mix(-st-accent-color, #222226, 92%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:focus { ++ color: -st-accent-fg-color; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ box-shadow: inset 0 0 0 2px st-transparentize(st-darken(-st-accent-color, 20%), 0.2) !important; ++ background-color: st-mix(-st-accent-color, st-mix(-st-accent-color, #222226, 92%), 5%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:focus:hover { ++ background-color: st-mix(-st-accent-color, st-darken(st-mix(-st-accent-color, #222226, 92%), 4%), 5%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:hover { ++ color: -st-accent-fg-color; ++ background-color: st-darken(st-mix(-st-accent-color, #222226, 92%), 4%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:active { ++ color: -st-accent-fg-color; ++ background-color: st-darken(st-mix(-st-accent-color, #222226, 92%), 9%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:active:hover { ++ background-color: st-darken(st-darken(st-mix(-st-accent-color, #222226, 92%), 9%), 4%); } ++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:active:focus { ++ background-color: st-mix(-st-accent-color, st-darken(st-mix(-st-accent-color, #222226, 92%), 9%), 5%); } ++ ++.quick-toggle-has-menu:checked .quick-toggle-separator { ++ background-color: st-mix(-st-accent-fg-color, -st-accent-color, 20%); } ++ ++.quick-toggle-has-menu .quick-toggle-separator { ++ background-color: rgba(34, 34, 38, 0.25); } + +.quick-slider > StBoxLayout { + spacing: 6px; } + +.quick-slider .icon-button, .quick-slider .login-dialog-button.cancel-button, .quick-slider .login-dialog-button.switch-user-button, .quick-slider .login-dialog-button.login-dialog-session-list-button, .quick-slider .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-slider .pager-button, .quick-slider .message .message-header .message-expand-button, .message .message-header .quick-slider .message-expand-button, +.quick-slider .message .message-header .message-close-button, +.message .message-header .quick-slider .message-close-button, .quick-slider .screenshot-ui-show-pointer-button { + padding: 6px; } + +.quick-slider .slider-bin { + padding: 6px; + border-radius: 999px; } + .quick-slider .slider-bin:focus { - color: #282828; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, st-mix(#282828, whitesmoke, 12%), 5%); } ++ color: #222226; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, st-mix(#222226, #fafafb, 12%), 5%); } + .quick-slider .slider-bin:focus:hover { - background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, whitesmoke, 12%), 4%), 5%); } ++ background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #fafafb, 12%), 4%), 5%); } + +.quick-toggle-menu { + border-radius: 24px; + margin: 12px 18px 0; } + .quick-toggle-menu:insensitive { - color: #282828; - background-color: st-mix(#282828, whitesmoke, 12%); } ++ color: #222226; ++ background-color: st-mix(#222226, #fafafb, 12%); } + .quick-toggle-menu .popup-menu-item > StIcon { + -st-icon-style: symbolic; + icon-size: 1.091em; } + .quick-toggle-menu .header { + spacing-rows: 3px; + spacing-columns: 12px; + padding-bottom: 12px; } + .quick-toggle-menu .header .icon { + icon-size: 1.6365em; + border-radius: 999px; + padding: 9px; - background-color: rgba(40, 40, 40, 0.2); } ++ background-color: rgba(34, 34, 38, 0.2); } + .quick-toggle-menu .header .icon.active { + background-color: -st-accent-color; + color: -st-accent-fg-color; } + +.quick-settings-system-item > StBoxLayout { + spacing: 12px; } + +.quick-settings-system-item .power-item { + min-height: 0; + min-width: 0; } + .quick-settings-system-item .power-item:insensitive { - color: #282828; - background-color: st-mix(#282828, whitesmoke, 12%); ++ color: #222226; ++ background-color: st-mix(#222226, #fafafb, 12%); + background-color: transparent; } + +.nm-network-item .wireless-secure-icon { + icon-size: 0.5455em; } + +.bt-device-item .popup-menu-icon { + -st-icon-style: symbolic; } + +.bt-menu-placeholder.popup-menu-item { + text-align: center; + padding: 2em 4em; } + +.device-subtitle { - color: rgba(40, 40, 40, 0.5); } ++ color: rgba(34, 34, 38, 0.5); } + +.keyboard-brightness-level { + spacing: 6px; } + +.background-apps-quick-toggle { + min-height: 2.728em; + background-color: transparent; } + .background-apps-quick-toggle StIcon { + icon-size: 1.091em !important; } + +.background-app-item .popup-menu-icon { + icon-size: 32px !important; + -st-icon-style: regular !important; } + +.background-app-item .icon-button, .background-app-item .login-dialog-button.cancel-button, .background-app-item .login-dialog-button.switch-user-button, .background-app-item .login-dialog-button.login-dialog-session-list-button, .background-app-item .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .background-app-item .pager-button, .background-app-item .message .message-header .message-expand-button, .message .message-header .background-app-item .message-expand-button, +.background-app-item .message .message-header .message-close-button, +.message .message-header .background-app-item .message-close-button, .background-app-item .screenshot-ui-show-pointer-button { + padding: 6px; - background-color: rgba(40, 40, 40, 0.13); } ++ background-color: rgba(34, 34, 38, 0.13); } + .background-app-item .icon-button:hover, .background-app-item .login-dialog-button.cancel-button:hover, .background-app-item .login-dialog-button.switch-user-button:hover, .background-app-item .login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .calendar .calendar-month-header .pager-button:hover, .calendar .calendar-month-header .background-app-item .pager-button:hover, .background-app-item .message .message-header .message-expand-button:hover, .message .message-header .background-app-item .message-expand-button:hover, + .background-app-item .message .message-header .message-close-button:hover, + .message .message-header .background-app-item .message-close-button:hover, .background-app-item .screenshot-ui-show-pointer-button:hover { - background-color: rgba(40, 40, 40, 0.22); } ++ background-color: rgba(34, 34, 38, 0.22); } + .background-app-item .icon-button:active, .background-app-item .login-dialog-button.cancel-button:active, .background-app-item .login-dialog-button.switch-user-button:active, .background-app-item .login-dialog-button.login-dialog-session-list-button:active, .background-app-item .calendar .calendar-month-header .pager-button:active, .calendar .calendar-month-header .background-app-item .pager-button:active, .background-app-item .message .message-header .message-expand-button:active, .message .message-header .background-app-item .message-expand-button:active, + .background-app-item .message .message-header .message-close-button:active, + .message .message-header .background-app-item .message-close-button:active, .background-app-item .screenshot-ui-show-pointer-button:active { - background-color: rgba(40, 40, 40, 0.31); } ++ background-color: rgba(34, 34, 38, 0.31); } + +.background-app-item .spinner { + padding: 6px; } + +.background-app-item.popup-inactive-menu-item { - color: #282828; } ++ color: #222226; } + +/* OVERVIEW */ +.secondary-monitor-workspaces { + spacing: 12px; } + +#overviewGroup { - background-color: #282828; } ++ background-color: #222226; } + +/* Window Picker */ +.window-picker { + spacing: 6px; } + +.window-close, .screenshot-ui-close-button { - background-color: rgba(71, 71, 71, 0.98); - color: whitesmoke; ++ background-color: rgba(63, 63, 70, 0.98); ++ color: #fafafb; + border-radius: 999px; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05); + padding: 3px; + height: 32px; + width: 32px; + transition-duration: 100ms; + border: 2px solid transparent; } + .window-close StIcon, .screenshot-ui-close-button StIcon { + icon-size: 24px; } + .window-close:hover, .screenshot-ui-close-button:hover { - background-color: rgba(88, 88, 88, 0.98); } ++ background-color: rgba(80, 80, 89, 0.98); } + .window-close:active, .screenshot-ui-close-button:active { - background-color: rgba(104, 104, 104, 0.98); } ++ background-color: rgba(94, 94, 105, 0.98); } + +.workspace-background { + border-radius: 30px; + background-color: rgba(3, 2, 1, 0); + box-shadow: 0 4px 16px 4px rgba(0, 0, 0, 0.05); } + +.search-entry { + border-radius: 999px; + margin-top: 12px; + margin-bottom: 6px; + width: 24em; } + .search-entry .search-entry-icon { + icon-size: 1.091em; + margin-top: 2px; + padding: 0 4px; } + +/* Search */ +#searchResults { + margin: 0 4px; } + +#searchResultsContent { + max-width: 1044px; } + +.search-section { + spacing: 18px; } + .search-section .search-section-separator { + height: 8px; + background-color: transparent; } + +.search-section-content { - background-color: #3d3d3d; - color: whitesmoke; ++ background-color: #38383b; ++ color: #fafafb; + border-radius: 24px; + padding: 12px; + margin: 0 12px; + border: 2px solid transparent; } + +.list-search-result, .search-provider-icon { - color: whitesmoke; - background-color: #3d3d3d; ++ color: #fafafb; ++ background-color: #38383b; ++ background-color: transparent; + border-radius: 13.2px; } + .list-search-result:focus, .search-provider-icon:focus { - color: whitesmoke; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(61, 61, 61, 0.25), 5%); } ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, rgba(56, 56, 59, 0.25), 5%); } + .list-search-result:focus:hover, .search-provider-icon:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 7%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(#38383b, 7%), 5%); } + .list-search-result:hover, .search-provider-icon:hover { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 7%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 7%); } + .list-search-result:active, .search-provider-icon:active { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 9%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 9%); } + .list-search-result:active:hover, .search-provider-icon:active:hover { - background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#38383b, 9%), 7%); } + .list-search-result:active:focus, .search-provider-icon:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(#38383b, 9%), 5%); } + .list-search-result:highlighted, .search-provider-icon:highlighted, .list-search-result:selected, .search-provider-icon:selected, .list-search-result:checked, .search-provider-icon:checked { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 8%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 8%); } + .list-search-result:highlighted:hover, .search-provider-icon:highlighted:hover, .list-search-result:selected:hover, .search-provider-icon:selected:hover, .list-search-result:checked:hover, .search-provider-icon:checked:hover { - background-color: st-lighten(st-lighten(#3d3d3d, 8%), 7%); } ++ background-color: st-lighten(st-lighten(#38383b, 8%), 7%); } + .list-search-result:highlighted:active, .search-provider-icon:highlighted:active, .list-search-result:selected:active, .search-provider-icon:selected:active, .list-search-result:checked:active, .search-provider-icon:checked:active { - background-color: st-lighten(st-lighten(#3d3d3d, 8%), 9%); } ++ background-color: st-lighten(st-lighten(#38383b, 8%), 9%); } + .list-search-result:insensitive, .search-provider-icon:insensitive { - color: st-transparentize(whitesmoke, 0.6); - background-color: #3d3d3d; } ++ color: st-transparentize(#fafafb, 0.6); ++ background-color: #38383b; } + .list-search-result:drop, .search-provider-icon:drop { + background-color: st-transparentize(-st-accent-color, 0.8); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); } + +.search-statustext { - color: rgba(245, 245, 245, 0.8); } ++ color: rgba(250, 250, 251, 0.8); } + +.grid-search-results { + spacing: 30px; } + +.search-provider-icon:ltr { + margin-right: 4px; } + +.search-provider-icon:rtl { + margin-left: 4px; } + +.search-provider-icon .list-search-provider-content { + spacing: 12px; } + .search-provider-icon .list-search-provider-content .list-search-provider-details { + width: 120px; - color: whitesmoke; } ++ color: #fafafb; } + +.list-search-results { + spacing: 6px; } + +.list-search-result .list-search-result-content { + spacing: 6px; } + +.list-search-result .list-search-result-title { + spacing: 12px; } + +.list-search-result .list-search-result-description { - color: #959595; } ++ color: #949497; } + +/* Dash */ +#dash { + padding-left: 6px; + padding-right: 6px; } + #dash .dash-background { - background-color: #3d3d3d; ++ background-color: #38383b; + border-radius: 28px; + padding-top: 12px; + padding-bottom: 12px; + padding-left: 10px; + padding-right: 10px; } + #dash .dash-item-container .placeholder { + background-image: none; + background-size: contain; + height: 32px; } + #dash .dash-item-container .empty-dash-drop-target { + width: 32px; + height: 32px; } + #dash .dash-item-container .show-apps, + #dash .dash-item-container .overview-tile, + #dash .dash-item-container .grid-search-result { + margin: 0 2px; + padding-bottom: 12px; } + #dash .dash-item-container .show-apps .overview-icon, + #dash .dash-item-container .overview-tile .overview-icon, + #dash .dash-item-container .grid-search-result .overview-icon { - color: whitesmoke; - background-color: #3d3d3d; } ++ color: #fafafb; ++ background-color: #38383b; } + #dash .dash-item-container .show-apps:focus .overview-icon, + #dash .dash-item-container .overview-tile:focus .overview-icon, + #dash .dash-item-container .grid-search-result:focus .overview-icon { - color: whitesmoke; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(61, 61, 61, 0.25), 5%); } ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, rgba(56, 56, 59, 0.25), 5%); } + #dash .dash-item-container .show-apps:focus .overview-icon:hover, + #dash .dash-item-container .overview-tile:focus .overview-icon:hover, + #dash .dash-item-container .grid-search-result:focus .overview-icon:hover { - background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 7%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(#38383b, 7%), 5%); } + #dash .dash-item-container .show-apps:hover .overview-icon, + #dash .dash-item-container .overview-tile:hover .overview-icon, + #dash .dash-item-container .grid-search-result:hover .overview-icon { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 7%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 7%); } + #dash .dash-item-container .show-apps:active .overview-icon, + #dash .dash-item-container .overview-tile:active .overview-icon, + #dash .dash-item-container .grid-search-result:active .overview-icon { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 9%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 9%); } + #dash .dash-item-container .show-apps:active .overview-icon:hover, + #dash .dash-item-container .overview-tile:active .overview-icon:hover, + #dash .dash-item-container .grid-search-result:active .overview-icon:hover { - background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#38383b, 9%), 7%); } + #dash .dash-item-container .show-apps:active .overview-icon:focus, + #dash .dash-item-container .overview-tile:active .overview-icon:focus, + #dash .dash-item-container .grid-search-result:active .overview-icon:focus { - background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(#38383b, 9%), 5%); } + #dash .dash-item-container .show-apps:checked .overview-icon, + #dash .dash-item-container .overview-tile:checked .overview-icon, + #dash .dash-item-container .grid-search-result:checked .overview-icon { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 8%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 8%); } + #dash .dash-item-container .show-apps:checked .overview-icon:hover, + #dash .dash-item-container .overview-tile:checked .overview-icon:hover, + #dash .dash-item-container .grid-search-result:checked .overview-icon:hover { - background-color: st-lighten(st-lighten(#3d3d3d, 8%), 7%); } ++ background-color: st-lighten(st-lighten(#38383b, 8%), 7%); } + #dash .dash-item-container .show-apps:checked .overview-icon:active, + #dash .dash-item-container .overview-tile:checked .overview-icon:active, + #dash .dash-item-container .grid-search-result:checked .overview-icon:active { - background-color: st-lighten(st-lighten(#3d3d3d, 8%), 9%); } ++ background-color: st-lighten(st-lighten(#38383b, 8%), 9%); } + #dash .dash-item-container .app-grid-running-dot { + offset-y: -12px; } + #dash .dash-separator { + width: 1px; + margin-left: 4px; + margin-right: 4px; - background-color: rgba(245, 245, 245, 0.1); } ++ background-color: rgba(250, 250, 251, 0.1); } + #dash .dash-separator, + #dash .dash-background { + margin-bottom: 12px; } + +.dash-label { + -y-offset: 8px; } + +/* App Grid */ +.icon-grid { + row-spacing: 12px; + column-spacing: 12px; + max-row-spacing: 36px; + max-column-spacing: 36px; + page-padding-top: 24px; + page-padding-bottom: 24px; + page-padding-left: 18px; + page-padding-right: 18px; } + +/* App Icons */ +.overview-tile, .grid-search-result { - color: whitesmoke; - background-color: #282828; ++ color: #fafafb; ++ background-color: #222226; ++ background-color: transparent; + border-radius: 24px; + padding: 12px; } + .overview-tile:focus, .grid-search-result:focus { - color: whitesmoke; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.25), 5%); } ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.25), 5%); } + .overview-tile:focus:hover, .grid-search-result:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(#282828, 7%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(#222226, 7%), 5%); } + .overview-tile:hover, .grid-search-result:hover { - color: whitesmoke; - background-color: st-lighten(#282828, 7%); } ++ color: #fafafb; ++ background-color: st-lighten(#222226, 7%); } + .overview-tile:active, .grid-search-result:active { - color: whitesmoke; - background-color: st-lighten(#282828, 9%); } ++ color: #fafafb; ++ background-color: st-lighten(#222226, 9%); } + .overview-tile:active:hover, .grid-search-result:active:hover { - background-color: st-lighten(st-lighten(#282828, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#222226, 9%), 7%); } + .overview-tile:active:focus, .grid-search-result:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#282828, 9%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(#222226, 9%), 5%); } + .overview-tile:highlighted, .grid-search-result:highlighted, .overview-tile:selected, .grid-search-result:selected, .overview-tile:checked, .grid-search-result:checked { - color: whitesmoke; - background-color: st-lighten(#282828, 8%); } ++ color: #fafafb; ++ background-color: st-lighten(#222226, 8%); } + .overview-tile:highlighted:hover, .grid-search-result:highlighted:hover, .overview-tile:selected:hover, .grid-search-result:selected:hover, .overview-tile:checked:hover, .grid-search-result:checked:hover { - background-color: st-lighten(st-lighten(#282828, 8%), 7%); } ++ background-color: st-lighten(st-lighten(#222226, 8%), 7%); } + .overview-tile:highlighted:active, .grid-search-result:highlighted:active, .overview-tile:selected:active, .grid-search-result:selected:active, .overview-tile:checked:active, .grid-search-result:checked:active { - background-color: st-lighten(st-lighten(#282828, 8%), 9%); } ++ background-color: st-lighten(st-lighten(#222226, 8%), 9%); } + .overview-tile:insensitive, .grid-search-result:insensitive { - color: st-transparentize(whitesmoke, 0.6); - background-color: #282828; } ++ color: st-transparentize(#fafafb, 0.6); ++ background-color: #222226; } + .overview-tile:drop, .grid-search-result:drop { + background-color: st-transparentize(-st-accent-color, 0.8); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); } + .overview-tile .overview-icon.overview-icon-with-label > StBoxLayout, .grid-search-result .overview-icon.overview-icon-with-label > StBoxLayout { + spacing: 6px; } + +.app-folder { - color: whitesmoke; - background-color: st-mix(whitesmoke, #282828, 12%); } ++ color: #fafafb; ++ background-color: st-mix(#fafafb, #222226, 12%); } + .app-folder:focus { - color: whitesmoke; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, st-mix(whitesmoke, #282828, 12%), 5%); } ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, st-mix(#fafafb, #222226, 12%), 5%); } + .app-folder:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 12%), 4%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(st-mix(#fafafb, #222226, 12%), 4%), 5%); } + .app-folder:hover { - color: whitesmoke; - background-color: st-lighten(st-mix(whitesmoke, #282828, 12%), 4%); } ++ color: #fafafb; ++ background-color: st-lighten(st-mix(#fafafb, #222226, 12%), 4%); } + .app-folder:active { - color: whitesmoke; - background-color: st-lighten(st-mix(whitesmoke, #282828, 12%), 9%); } ++ color: #fafafb; ++ background-color: st-lighten(st-mix(#fafafb, #222226, 12%), 9%); } + .app-folder:active:hover { - background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 12%), 9%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 12%), 9%), 4%); } + .app-folder:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 12%), 9%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(st-mix(#fafafb, #222226, 12%), 9%), 5%); } + .app-folder:highlighted, .app-folder:selected, .app-folder:checked { - color: whitesmoke; - background-color: st-lighten(st-mix(whitesmoke, #282828, 12%), 8%); } ++ color: #fafafb; ++ background-color: st-lighten(st-mix(#fafafb, #222226, 12%), 8%); } + .app-folder:highlighted:hover, .app-folder:selected:hover, .app-folder:checked:hover { - background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 12%), 8%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 12%), 8%), 4%); } + .app-folder:highlighted:active, .app-folder:selected:active, .app-folder:checked:active { - background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 12%), 8%), 9%); } ++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 12%), 8%), 9%); } + .app-folder:insensitive { - color: st-transparentize(whitesmoke, 0.6); - background-color: st-darken(st-mix(whitesmoke, #282828, 12%), 3%); } ++ color: st-transparentize(#fafafb, 0.6); ++ background-color: st-darken(st-mix(#fafafb, #222226, 12%), 3%); } + .app-folder:drop { + background-color: st-transparentize(-st-accent-color, 0.8); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); } + +.app-grid-running-dot { + height: 5px; + width: 5px; + border-radius: 5px; - background-color: whitesmoke; ++ background-color: #fafafb; + offset-y: 6px; } + +.app-folder-dialog-container { + padding-top: 2.2em; } + +.app-folder-dialog { + width: 720px; + height: 720px; + border-radius: 64px; - background-color: #3d3d3d; - color: whitesmoke; ++ background-color: #38383b; ++ color: #fafafb; + padding: 0 1px; - box-shadow: inset 0 0 0 1px rgba(245, 245, 245, 0.1); } ++ box-shadow: inset 0 0 0 1px rgba(250, 250, 251, 0.1); } + .app-folder-dialog .folder-name-container { + padding: 24px 36px; + padding-bottom: 0; } + .app-folder-dialog .folder-name-container .folder-name-entry { + width: 12em; } + .app-folder-dialog .icon-button, .app-folder-dialog .login-dialog-button.cancel-button, .app-folder-dialog .login-dialog-button.switch-user-button, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button, .app-folder-dialog .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .app-folder-dialog .pager-button, .app-folder-dialog .message .message-header .message-expand-button, .message .message-header .app-folder-dialog .message-expand-button, + .app-folder-dialog .message .message-header .message-close-button, + .message .message-header .app-folder-dialog .message-close-button, .app-folder-dialog .screenshot-ui-show-pointer-button { - color: whitesmoke; - background-color: st-mix(whitesmoke, #3d3d3d, 12%); } ++ color: #fafafb; ++ background-color: st-mix(#fafafb, #38383b, 12%); } + .app-folder-dialog .icon-button:hover, .app-folder-dialog .login-dialog-button.cancel-button:hover, .app-folder-dialog .login-dialog-button.switch-user-button:hover, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:hover, .app-folder-dialog .calendar .calendar-month-header .pager-button:hover, .calendar .calendar-month-header .app-folder-dialog .pager-button:hover, .app-folder-dialog .message .message-header .message-expand-button:hover, .message .message-header .app-folder-dialog .message-expand-button:hover, + .app-folder-dialog .message .message-header .message-close-button:hover, + .message .message-header .app-folder-dialog .message-close-button:hover, .app-folder-dialog .screenshot-ui-show-pointer-button:hover { - color: whitesmoke; - background-color: st-lighten(st-mix(whitesmoke, #3d3d3d, 12%), 4%); } ++ color: #fafafb; ++ background-color: st-lighten(st-mix(#fafafb, #38383b, 12%), 4%); } + .app-folder-dialog .icon-button:active, .app-folder-dialog .login-dialog-button.cancel-button:active, .app-folder-dialog .login-dialog-button.switch-user-button:active, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active, .app-folder-dialog .calendar .calendar-month-header .pager-button:active, .calendar .calendar-month-header .app-folder-dialog .pager-button:active, .app-folder-dialog .message .message-header .message-expand-button:active, .message .message-header .app-folder-dialog .message-expand-button:active, + .app-folder-dialog .message .message-header .message-close-button:active, + .message .message-header .app-folder-dialog .message-close-button:active, .app-folder-dialog .screenshot-ui-show-pointer-button:active { - color: whitesmoke; - background-color: st-lighten(st-mix(whitesmoke, #3d3d3d, 12%), 9%); } ++ color: #fafafb; ++ background-color: st-lighten(st-mix(#fafafb, #38383b, 12%), 9%); } + .app-folder-dialog .icon-button:active:hover, .app-folder-dialog .login-dialog-button.cancel-button:active:hover, .app-folder-dialog .login-dialog-button.switch-user-button:active:hover, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active:hover, .app-folder-dialog .calendar .calendar-month-header .pager-button:active:hover, .calendar .calendar-month-header .app-folder-dialog .pager-button:active:hover, .app-folder-dialog .message .message-header .message-expand-button:active:hover, .message .message-header .app-folder-dialog .message-expand-button:active:hover, + .app-folder-dialog .message .message-header .message-close-button:active:hover, + .message .message-header .app-folder-dialog .message-close-button:active:hover, .app-folder-dialog .screenshot-ui-show-pointer-button:active:hover { - background-color: st-lighten(st-lighten(st-mix(whitesmoke, #3d3d3d, 12%), 9%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #38383b, 12%), 9%), 4%); } + .app-folder-dialog .icon-button:active:focus, .app-folder-dialog .login-dialog-button.cancel-button:active:focus, .app-folder-dialog .login-dialog-button.switch-user-button:active:focus, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active:focus, .app-folder-dialog .calendar .calendar-month-header .pager-button:active:focus, .calendar .calendar-month-header .app-folder-dialog .pager-button:active:focus, .app-folder-dialog .message .message-header .message-expand-button:active:focus, .message .message-header .app-folder-dialog .message-expand-button:active:focus, + .app-folder-dialog .message .message-header .message-close-button:active:focus, + .message .message-header .app-folder-dialog .message-close-button:active:focus, .app-folder-dialog .screenshot-ui-show-pointer-button:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #3d3d3d, 12%), 9%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(st-mix(#fafafb, #38383b, 12%), 9%), 5%); } + .app-folder-dialog .page-indicators { + margin-bottom: 24px; } + .app-folder-dialog .page-navigation-arrow { - color: whitesmoke; - background-color: #3d3d3d; } ++ color: #fafafb; ++ background-color: #38383b; } + .app-folder-dialog .page-navigation-arrow:hover { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 7%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 7%); } + .app-folder-dialog .page-navigation-arrow:active { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 9%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 9%); } + .app-folder-dialog .page-navigation-arrow:active:hover { - background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#38383b, 9%), 7%); } + .app-folder-dialog .page-navigation-arrow:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(#38383b, 9%), 5%); } + .app-folder-dialog .overview-tile, .app-folder-dialog .grid-search-result { - color: whitesmoke; - background-color: #3d3d3d; } ++ color: #fafafb; ++ background-color: #38383b; ++ background-color: transparent; } + .app-folder-dialog .overview-tile:focus, .app-folder-dialog .grid-search-result:focus { - color: whitesmoke; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(61, 61, 61, 0.25), 5%); } ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, rgba(56, 56, 59, 0.25), 5%); } + .app-folder-dialog .overview-tile:focus:hover, .app-folder-dialog .grid-search-result:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 7%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(#38383b, 7%), 5%); } + .app-folder-dialog .overview-tile:hover, .app-folder-dialog .grid-search-result:hover { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 7%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 7%); } + .app-folder-dialog .overview-tile:active, .app-folder-dialog .grid-search-result:active { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 9%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 9%); } + .app-folder-dialog .overview-tile:active:hover, .app-folder-dialog .grid-search-result:active:hover { - background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#38383b, 9%), 7%); } + .app-folder-dialog .overview-tile:active:focus, .app-folder-dialog .grid-search-result:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(#38383b, 9%), 5%); } + .app-folder-dialog .overview-tile:highlighted, .app-folder-dialog .grid-search-result:highlighted, .app-folder-dialog .overview-tile:selected, .app-folder-dialog .grid-search-result:selected, .app-folder-dialog .overview-tile:checked, .app-folder-dialog .grid-search-result:checked { - color: whitesmoke; - background-color: st-lighten(#3d3d3d, 8%); } ++ color: #fafafb; ++ background-color: st-lighten(#38383b, 8%); } + .app-folder-dialog .overview-tile:highlighted:hover, .app-folder-dialog .grid-search-result:highlighted:hover, .app-folder-dialog .overview-tile:selected:hover, .app-folder-dialog .grid-search-result:selected:hover, .app-folder-dialog .overview-tile:checked:hover, .app-folder-dialog .grid-search-result:checked:hover { - background-color: st-lighten(st-lighten(#3d3d3d, 8%), 7%); } ++ background-color: st-lighten(st-lighten(#38383b, 8%), 7%); } + .app-folder-dialog .overview-tile:highlighted:active, .app-folder-dialog .grid-search-result:highlighted:active, .app-folder-dialog .overview-tile:selected:active, .app-folder-dialog .grid-search-result:selected:active, .app-folder-dialog .overview-tile:checked:active, .app-folder-dialog .grid-search-result:checked:active { - background-color: st-lighten(st-lighten(#3d3d3d, 8%), 9%); } ++ background-color: st-lighten(st-lighten(#38383b, 8%), 9%); } + .app-folder-dialog .overview-tile:insensitive, .app-folder-dialog .grid-search-result:insensitive { - color: st-transparentize(whitesmoke, 0.6); - background-color: #3d3d3d; } ++ color: st-transparentize(#fafafb, 0.6); ++ background-color: #38383b; } + .app-folder-dialog .overview-tile:drop, .app-folder-dialog .grid-search-result:drop { + background-color: st-transparentize(-st-accent-color, 0.8); + box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); } + +.rename-folder-popup .rename-folder-popup-item { + spacing: 6px; } + .rename-folder-popup .rename-folder-popup-item:ltr, .rename-folder-popup .rename-folder-popup-item:rtl { + padding: 0 12px; } + +.page-indicator { + padding: 6px 12px 0; + transition-duration: 400ms; } + .page-indicator .page-indicator-icon { + width: 10px; + height: 10px; + border-radius: 999px; - background-color: whitesmoke; ++ background-color: #fafafb; + transition-duration: 400ms; } + +.apps-scroll-view { + padding: 0; } + +.system-action-icon { - background-color: rgba(245, 245, 245, 0.1); - color: whitesmoke; ++ background-color: rgba(250, 250, 251, 0.1); ++ color: #fafafb; + border-radius: 999px; + icon-size: 48px; } + +.page-navigation-hint.dnd { + background: rgba(255, 255, 255, 0.1); } + +.page-navigation-hint.next:ltr, .page-navigation-hint.previous:rtl { + background-gradient-start: rgba(255, 255, 255, 0.05); + background-gradient-end: transparent; + background-gradient-direction: horizontal; + border-radius: 24px 0px 0px 24px; } + +.page-navigation-hint.previous:ltr, .page-navigation-hint.next:rtl { + background-gradient-start: transparent; + background-gradient-end: rgba(255, 255, 255, 0.05); + background-gradient-direction: horizontal; + border-radius: 0px 24px 24px 0px; } + +.page-navigation-arrow { + margin: 6px; + padding: 18px; + width: 24px; + height: 24px; + border-radius: 999px; + transition-duration: 100ms; - color: whitesmoke; - background-color: #282828; } ++ color: #fafafb; ++ background-color: #222226; } + .page-navigation-arrow > StIcon { - color: whitesmoke; } ++ color: #fafafb; } + .page-navigation-arrow:hover { - color: whitesmoke; - background-color: st-lighten(#282828, 7%); } ++ color: #fafafb; ++ background-color: st-lighten(#222226, 7%); } + .page-navigation-arrow:active { - color: whitesmoke; - background-color: st-lighten(#282828, 9%); } ++ color: #fafafb; ++ background-color: st-lighten(#222226, 9%); } + .page-navigation-arrow:active:hover { - background-color: st-lighten(st-lighten(#282828, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#222226, 9%), 7%); } + .page-navigation-arrow:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#282828, 9%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(#222226, 9%), 5%); } + +/* Workspace pager */ +.workspace-thumbnails { + visible-width: 32px; + spacing: 6px; + padding: 6px; } + .workspace-thumbnails .workspace-thumbnail { - color: whitesmoke; - background-color: #4e4e4e; ++ color: #fafafb; ++ background-color: #46464e; + border-radius: 4px; + border: 1px solid transparent; } + .workspace-thumbnails .placeholder { + background-image: url("resource:///org/gnome/shell/theme/workspace-placeholder.svg"); + background-size: contain; + width: 18px; } + +.workspace-thumbnail-indicator { + border: 3px solid -st-accent-color; + border-radius: 8px; } + +.ripple-pointer-location { + width: 50px; + height: 50px; + border-radius: 25px; + background-color: st-lighten(st-transparentize(-st-accent-color, 0.7), 30%); + box-shadow: 0 0 2px 2px st-lighten(-st-accent-color, 20%); } + +.pie-timer { + width: 60px; + height: 60px; + -pie-border-width: 3px; + -pie-border-color: -st-accent-color; + -pie-background-color: st-lighten(st-transparentize(-st-accent-color, 0.7), 40%); } + +.magnifier-zoom-region { + border: 2px solid -st-accent-color; } + .magnifier-zoom-region.full-screen { + border-width: 0; } + +.select-area-rubberband { + background-color: st-transparentize(-st-accent-color, 0.7); + border: 1px solid -st-accent-color; } + +.user-icon { + background-size: contain; + border-radius: 999px; + icon-size: 64px; - background-color: rgba(255, 255, 255, 0.05); - color: #ffffff; } ++ background-color: rgba(34, 34, 38, 0.05); ++ color: #222226; } + .user-icon StIcon { + padding: 12px; } + .user-icon.user-avatar { - box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1); } ++ box-shadow: inset 0 0 0 1px rgba(34, 34, 38, 0.1); } + +.lightbox { + background-color: black; } + +.flashspot { + background-color: white; } + +.hidden { + color: transparent; } + +.caps-lock-warning-label { + text-align: center; + padding-bottom: 8px; - color: #f5c211; } ++ color: #e5a50a; } + +/* Workspace animation */ +.workspace-animation { - background-color: #353535; } ++ background-color: #2e2e33; } + +/* Tiled window previews */ +.tile-preview { + background-color: st-transparentize(-st-accent-color, 0.5); + border: 1px solid -st-accent-color; } + +/* On-screen Keyboard */ +#keyboard { - background-color: #353535; ++ background-color: #2e2e33; + box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.02); } + #keyboard .page-indicator { + padding: 6px; } + #keyboard .page-indicator .page-indicator-icon { + width: 8px; + height: 8px; } + +.key-container { + padding: 4px; + spacing: 4px; } + +.keyboard-key { + font-size: 1.455em; + font-weight: bold; - min-height: 1.2em; - min-width: 1.2em; - border-width: 1px; - border-style: solid; - border-radius: 10px; ++ border-radius: 0.546em; + box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.05); + color: #ffffff; + background-color: st-mix(#ffffff, #4d4d4d, 12%); } + .keyboard-key:focus { - color: #282828; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, st-mix(#282828, whitesmoke, 12%), 5%); } ++ color: #222226; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, st-mix(#222226, #fafafb, 12%), 5%); } + .keyboard-key:focus:hover { - background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, whitesmoke, 12%), 4%), 5%); } ++ background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #fafafb, 12%), 4%), 5%); } + .keyboard-key:hover { + color: #ffffff; + background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 4%); } + .keyboard-key:active { + color: #ffffff; + background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%); } + .keyboard-key:active:hover { + background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%), 4%); } + .keyboard-key:active:focus { + background-color: st-mix(-st-accent-color, st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%), 5%); } + .keyboard-key:checked { + color: #ffffff; + background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%); } + .keyboard-key:checked:hover { + background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%), 4%); } + .keyboard-key:checked:active { + background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%), 9%); } - .keyboard-key:grayed { - background-color: #ededed; - color: #ffffff; - border-color: rgba(255, 255, 255, 0.1); } + .keyboard-key.default-key { + color: #ffffff; + background-color: st-mix(#ffffff, #303030, 12%); - border-radius: 10px; } ++ border: none; } + .keyboard-key.default-key:hover { + color: #ffffff; + background-color: st-darken(st-mix(#ffffff, #303030, 12%), 4%); } + .keyboard-key.default-key:active { + color: #ffffff; + background-color: st-darken(st-mix(#ffffff, #303030, 12%), 9%); } + .keyboard-key.default-key:active:hover { + background-color: st-darken(st-darken(st-mix(#ffffff, #303030, 12%), 9%), 4%); } + .keyboard-key.default-key:active:focus { + background-color: st-mix(-st-accent-color, st-darken(st-mix(#ffffff, #303030, 12%), 9%), 5%); } + .keyboard-key.default-key:checked { + color: #ffffff; + background-color: st-darken(st-mix(#ffffff, #303030, 12%), 8%); } + .keyboard-key.default-key:checked:hover { + background-color: st-darken(st-darken(st-mix(#ffffff, #303030, 12%), 8%), 4%); } + .keyboard-key.default-key:checked:active { + background-color: st-darken(st-darken(st-mix(#ffffff, #303030, 12%), 8%), 9%); } + .keyboard-key.default-key:latched { - border-color: st-lighten(-st-accent-color, 5%); + background-color: -st-accent-color; } - .keyboard-key.enter-key { - color: -st-accent-fg-color; - background-color: st-mix(-st-accent-fg-color, -st-accent-color, 12%); - border-radius: 10px; - color: #ffffff; } - .keyboard-key.enter-key:hover { - color: -st-accent-fg-color; - background-color: st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 4%); } - .keyboard-key.enter-key:active { - color: -st-accent-fg-color; - background-color: st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 9%); } - .keyboard-key.enter-key:active:hover { - background-color: st-darken(st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 9%), 4%); } - .keyboard-key.enter-key:active:focus { - background-color: st-mix(-st-accent-color, st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 9%), 5%); } - .keyboard-key.enter-key:checked { - color: -st-accent-fg-color; - background-color: st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 8%); } - .keyboard-key.enter-key:checked:hover { - background-color: st-darken(st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 8%), 4%); } - .keyboard-key.enter-key:checked:active { - background-color: st-darken(st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 8%), 9%); } - .keyboard-key.shift-key-uppercase { - background-color: gray; - color: #353535; } - .keyboard-key.shift-key-uppercase:hover { - background-color: #8c8c8c; - color: #424242; } + .keyboard-key StIcon { - icon-size: 24px; } ++ icon-size: 1.6365em; } + - .keyboard-subkeys { - -arrow-border-radius: 16px; - -arrow-background-color: #353535; ++.keyboard-subkeys-boxpointer { ++ -arrow-border-radius: 22px; ++ -arrow-background-color: #2e2e33; + -arrow-border-width: 1px; - -arrow-border-color: #4c4c4c; ++ -arrow-border-color: #44444c; + -arrow-base: 20px; + -arrow-rise: 10px; - -boxpointer-gap: 6px; - padding: 6px; } - .keyboard-subkeys .keyboard-key { - color: #ffffff; - background-color: st-mix(#ffffff, #4d4d4d, 12%); - border-radius: 10px; } - .keyboard-subkeys .keyboard-key:focus { - color: #282828; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, st-mix(#282828, whitesmoke, 12%), 5%); } - .keyboard-subkeys .keyboard-key:focus:hover { - background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, whitesmoke, 12%), 4%), 5%); } - .keyboard-subkeys .keyboard-key:hover { - color: #ffffff; - background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 4%); } - .keyboard-subkeys .keyboard-key:active { - color: #ffffff; - background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%); } - .keyboard-subkeys .keyboard-key:active:hover { - background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%), 4%); } - .keyboard-subkeys .keyboard-key:active:focus { - background-color: st-mix(-st-accent-color, st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%), 5%); } - .keyboard-subkeys .keyboard-key:checked { - color: #ffffff; - background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%); } - .keyboard-subkeys .keyboard-key:checked:hover { - background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%), 4%); } - .keyboard-subkeys .keyboard-key:checked:active { - background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%), 9%); } ++ -boxpointer-gap: 4px; ++ border-radius: 22px; ++ box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.1); } ++ .keyboard-subkeys-boxpointer .key-container { ++ padding: 12px; ++ spacing: 8px; } + +.emoji-page .keyboard-key { + background-color: transparent; + border: none; + color: initial; } + +.emoji-panel .keyboard-key:latched { + border-color: st-lighten(-st-accent-color, 5%); + background-color: -st-accent-color; } + +.word-suggestions { + spacing: 12px; + min-height: 17pt; + padding: 12px; + color: #ffffff; } + .word-suggestions StButton { + margin: 0 3px; + min-width: 32px; + border-radius: 4px; - padding: 0px 18px; ++ padding: 6px 18px; + background-color: transparent; + border-color: transparent; + box-shadow: none; } + .word-suggestions StButton:insensitive { + background-color: transparent !important; } + .word-suggestions StButton:focus { - color: #282828; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, st-mix(#282828, whitesmoke, 12%), 5%); } ++ color: #222226; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, st-mix(#222226, #fafafb, 12%), 5%); } + .word-suggestions StButton:focus:hover { - background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, whitesmoke, 12%), 4%), 5%); } ++ background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #fafafb, 12%), 4%), 5%); } + .word-suggestions StButton:hover { + color: #ffffff; + background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 4%); } + .word-suggestions StButton:active { + color: #ffffff; + background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%); } + .word-suggestions StButton:active:hover { + background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%), 4%); } + .word-suggestions StButton:active:focus { + background-color: st-mix(-st-accent-color, st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%), 5%); } + .word-suggestions StButton:checked { + color: #ffffff; + background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%); } + .word-suggestions StButton:checked:hover { + background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%), 4%); } + .word-suggestions StButton:checked:active { + background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%), 9%); } + +/* Looking Glass */ +.lg-dialog StEntry { + min-height: 1.5em; } + +.lg-dialog .shell-link { + color: st-lighten(-st-accent-color, 20%); } + .lg-dialog .shell-link:hover { + color: st-lighten(st-lighten(-st-accent-color, 20%), 10%); } + .lg-dialog .shell-link:active { + color: st-darken(st-lighten(-st-accent-color, 20%), 10%); } + +.lg-dialog .actor-link { + color: st-darken(#ffffff, 20%); } + .lg-dialog .actor-link:hover { + color: #ffffff; } + .lg-dialog .actor-link:active { + color: st-lighten(#ffffff, 20%); } + .lg-dialog .actor-link StIcon { + icon-size: 12px; } + +.lg-completions-text { + font-style: italic; } + +#LookingGlassDialog { - background-color: rgba(53, 53, 53, 0.98); ++ background-color: rgba(46, 46, 51, 0.98); + color: #ffffff; + border-radius: 16px; + margin-top: 4px; + border: 2px solid transparent; + padding: 6px; + spacing: 6px; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05); } + #LookingGlassDialog > #Toolbar { + border: none; + padding: 6px; + border-radius: 0; + background-color: transparent; + spacing: 6px; } + #LookingGlassDialog > #Toolbar .lg-toolbar-button { + padding: 6px 12px; } + #LookingGlassDialog > #Toolbar .lg-toolbar-button > StIcon { + icon-size: 16px; } + #LookingGlassDialog .labels { + spacing: 6px; } + #LookingGlassDialog .notebook-tab { + background-color: transparent; + -natural-hpadding: 12px; + -minimum-hpadding: 12px; + padding: 6px 12px; } + #LookingGlassDialog .notebook-tab:selected { + color: #ffffff; - background-color: st-lighten(st-mix(#ffffff, #353535, 12%), 9%); } ++ background-color: st-lighten(st-mix(#ffffff, #2e2e33, 12%), 9%); } + #LookingGlassDialog .notebook-tab:selected:hover { - background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 12%), 9%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 12%), 9%), 4%); } + #LookingGlassDialog .notebook-tab:selected:focus { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 12%), 9%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #2e2e33, 12%), 9%), 5%); } + +#LookingGlassPropertyInspector { - background-color: #353535; ++ background-color: #2e2e33; + color: #ffffff; + border-radius: 16px; + border: 1px solid rgba(255, 255, 255, 0.1); + padding: 12px; } + #LookingGlassPropertyInspector .lg-obj-inspector-title { + spacing: 4px; } + #LookingGlassPropertyInspector .lg-obj-inspector-close-button, + #LookingGlassPropertyInspector .lg-obj-inspector-button { + padding: 6px 12px; } + #LookingGlassPropertyInspector .lg-obj-inspector-close-button { + margin: 4px; + padding: 6px; + border-radius: 999px; } + #LookingGlassPropertyInspector .lg-obj-inspector-close-button > StIcon { + icon-size: 16px; } + +#LookingGlassEvaluator { + padding: 6px; } + #LookingGlassEvaluator .evaluator-results { + spacing: 6px; } + +#LookingGlassWindows { + padding: 6px; + spacing: 6px; } + #LookingGlassWindows .lg-window { + color: #ffffff; - background-color: st-mix(#ffffff, #353535, 12%); ++ background-color: st-mix(#ffffff, #2e2e33, 12%); + margin: 0; + padding: 12px; } + +#LookingGlassExtensions .lg-extensions-list { + padding: 6px; + spacing: 6px; } + +#LookingGlassExtensions .lg-extension { + color: #ffffff; - background-color: st-mix(#ffffff, #353535, 12%); ++ background-color: st-mix(#ffffff, #2e2e33, 12%); + margin: 0; + spacing: 4px; + padding: 12px; } + #LookingGlassExtensions .lg-extension .lg-extension-name { + color: #ffffff !important; } + #LookingGlassExtensions .lg-extension .lg-extension-meta { + spacing: 12px; } + +#LookingGlassExtensions .lg-extensions-none { + color: rgba(255, 255, 255, 0.5); } + +#LookingGlassActors { + padding: 6px; + spacing: 4px; } + +#LookingGlassDebugFlags .lg-debug-flags-header { + padding: 6px; + padding-top: 12px; } + +#LookingGlassDebugFlags .lg-debug-flag-button { + padding: 9px 12px; + margin-bottom: 6px; } + #LookingGlassDebugFlags .lg-debug-flag-button StLabel { + font-weight: normal !important; } + #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch { + background: rgba(255, 255, 255, 0.15); } + #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:hover { + background: rgba(255, 255, 255, 0.2); } + #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:checked { + background: -st-accent-color; + color: -st-accent-fg-color; } + #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:checked:hover { + background-color: st-lighten(-st-accent-color, 5%); + color: st-lighten(-st-accent-fg-color, 5%); } + +.login-dialog, +.unlock-dialog { - color: whitesmoke; } ++ color: #fafafb; } + .login-dialog .caps-lock-warning-label, + .login-dialog .login-dialog-message-warning, + .unlock-dialog .caps-lock-warning-label, + .unlock-dialog .login-dialog-message-warning { - color: whitesmoke; } ++ color: #fafafb; } + .login-dialog .login-dialog-prompt-layout, + .unlock-dialog .login-dialog-prompt-layout { + width: 25em; + spacing: 9px; } + +.login-dialog-button.cancel-button { + padding: 9px; } + +.login-dialog-button-box { + spacing: 12px; } + +.conflicting-session-dialog-content { + spacing: 20px; } + .conflicting-session-dialog-content .conflicting-session-dialog-title { + text-align: center; + margin-bottom: 5px; } + .conflicting-session-dialog-content .conflicting-session-dialog-desc { + text-align: center; } + .conflicting-session-dialog-content .conflicting-session-dialog-desc-warning { + text-align: center; - color: #f5c211; } ++ color: #e5a50a; } + +.login-dialog-logo-bin { + margin: 3em 0; } + +.login-dialog-banner-view { + max-width: 25em; } + .login-dialog-banner-view .login-dialog-banner { - color: gainsboro; } ++ color: #dedee4; } + +.login-dialog-message { + text-align: center; } + +.login-dialog-message-hint, .login-dialog-message { - color: gainsboro; ++ color: #dedee4; + min-height: 2.75em; } + +.login-dialog-user-selection-box { + padding-top: 4em; + padding-bottom: 8em; } + +.login-dialog-not-listed-label { + padding: 6px; } + +.login-dialog-not-listed-button { - color: whitesmoke; - background-color: #282828; ++ color: #fafafb; ++ background-color: #222226; + padding: 0 6px; + margin: 6px; } + .login-dialog-not-listed-button:focus { - color: whitesmoke; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.25), 5%); } ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.25), 5%); } + .login-dialog-not-listed-button:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(#282828, 7%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(#222226, 7%), 5%); } + .login-dialog-not-listed-button:hover { - color: whitesmoke; - background-color: st-lighten(#282828, 7%); } ++ color: #fafafb; ++ background-color: st-lighten(#222226, 7%); } + .login-dialog-not-listed-button:active { - color: whitesmoke; - background-color: st-lighten(#282828, 9%); } ++ color: #fafafb; ++ background-color: st-lighten(#222226, 9%); } + .login-dialog-not-listed-button:active:hover { - background-color: st-lighten(st-lighten(#282828, 9%), 7%); } ++ background-color: st-lighten(st-lighten(#222226, 9%), 7%); } + .login-dialog-not-listed-button:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(#282828, 9%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(#222226, 9%), 5%); } + +.login-dialog-auth-list-view { + -st-vfade-offset: 3em; } + +.login-dialog-auth-list { + spacing: 6px; + margin-left: 2em; } + +.login-dialog-auth-list-title { + margin-left: 2em; } + +.login-dialog-auth-list-item { + border-radius: 16px; + padding: 4px; - color: darkgray; } ++ color: #a5a5b7; } + .login-dialog-auth-list-item:focus, .login-dialog-auth-list-item:selected { + background-color: -st-accent-color; + color: -st-accent-fg-color; } + +.login-dialog-auth-list-label:ltr { + padding-left: 15px; + text-align: left; } + +.login-dialog-auth-list-label:rtl { + padding-right: 15px; + text-align: right; } + +.login-dialog-user-list-view { + width: 25em; + -st-vfade-offset: 3em; } + .login-dialog-user-list-view .login-dialog-user-list { + margin: 0 8px; + spacing: 12px; } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item { - color: whitesmoke; - background-color: st-mix(whitesmoke, #282828, 12%); ++ color: #fafafb; ++ background-color: st-mix(#fafafb, #222226, 12%); + border-radius: 16px; + padding: 9px; } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:selected, .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:focus { - color: whitesmoke; - box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important; - background-color: st-mix(-st-accent-color, st-mix(whitesmoke, #282828, 12%), 5%); } ++ color: #fafafb; ++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important; ++ background-color: st-mix(-st-accent-color, st-mix(#fafafb, #222226, 12%), 5%); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:selected:hover, .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:focus:hover { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 12%), 4%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(st-mix(#fafafb, #222226, 12%), 4%), 5%); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:hover { - color: whitesmoke; - background-color: st-lighten(st-mix(whitesmoke, #282828, 12%), 4%); } ++ color: #fafafb; ++ background-color: st-lighten(st-mix(#fafafb, #222226, 12%), 4%); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active { - color: whitesmoke; - background-color: st-lighten(st-mix(whitesmoke, #282828, 12%), 9%); } ++ color: #fafafb; ++ background-color: st-lighten(st-mix(#fafafb, #222226, 12%), 9%); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active:hover { - background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 12%), 9%), 4%); } ++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 12%), 9%), 4%); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active:focus { - background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 12%), 9%), 5%); } ++ background-color: st-mix(-st-accent-color, st-lighten(st-mix(#fafafb, #222226, 12%), 9%), 5%); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item .user-icon { + border: 2px solid transparent; } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item .login-dialog-timed-login-indicator { + height: 2px; + margin-top: 6px; - background-color: rgba(245, 245, 245, 0.7); } ++ background-color: rgba(250, 250, 251, 0.7); } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:logged-in .user-icon { + border-color: -st-accent-color; } + .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:logged-in .user-icon StIcon { + background-color: st-transparentize(-st-accent-color, 0.7); } + +.unlock-dialog { + background-color: transparent; } + +.screen-shield-background { + background: black; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.6); } + +#lockDialogGroup { - background-color: #282828; } ++ background-color: #222226; } + +.unlock-dialog-clock { - color: whitesmoke; ++ color: #fafafb; + spacing: 2em; } + .unlock-dialog-clock .unlock-dialog-clock-time { + font-size: 6.546em; + font-weight: 800; } + .unlock-dialog-clock .unlock-dialog-clock-date { + font-weight: 400; } + .unlock-dialog-clock .unlock-dialog-clock-hint { + margin-top: 2em; + padding: 6px 18px; + border-radius: 16px; + font-weight: bold; } + +#unlockDialogNotifications StButton#vhandle, #unlockDialogNotifications StButton#hhandle { - background-color: rgba(245, 245, 245, 0.3); } ++ background-color: rgba(250, 250, 251, 0.3); } + #unlockDialogNotifications StButton#vhandle:hover, #unlockDialogNotifications StButton#vhandle:focus, #unlockDialogNotifications StButton#hhandle:hover, #unlockDialogNotifications StButton#hhandle:focus { - background-color: rgba(245, 245, 245, 0.5); } ++ background-color: rgba(250, 250, 251, 0.5); } + #unlockDialogNotifications StButton#vhandle:active, #unlockDialogNotifications StButton#hhandle:active { + background-color: st-transparentize(-st-accent-color, 0.5); } + +.unlock-dialog-notifications-container { + margin: 12px; + spacing: 6px; + width: 25em; + background-color: transparent; } + .unlock-dialog-notifications-container .summary-notification-stack-scrollview { + padding-top: 0; + padding-bottom: 0; } + .unlock-dialog-notifications-container .notification, + .unlock-dialog-notifications-container .unlock-dialog-notification-source { + padding: 12px 16px; + border: none; - background-color: rgba(245, 245, 245, 0.1); - color: whitesmoke; ++ background-color: rgba(250, 250, 251, 0.1); ++ color: #fafafb; + border-radius: 16px; } + .unlock-dialog-notifications-container .notification.critical, + .unlock-dialog-notifications-container .unlock-dialog-notification-source.critical { - background-color: rgba(245, 245, 245, 0.2); } ++ background-color: rgba(250, 250, 251, 0.2); } + +.unlock-dialog-notification-icon { + icon-size: 32px; } + +.unlock-dialog-notification-label { + padding-left: 12px; + padding-right: 0; } + .unlock-dialog-notification-label:rtl { + padding-right: 12px; + padding-left: 0; } + +.unlock-dialog-notification-count-text { + font-weight: bold; + padding: 0 12px; - color: whitesmoke; - background-color: rgba(245, 245, 245, 0.1); ++ color: #fafafb; ++ background-color: rgba(250, 250, 251, 0.1); + border-radius: 999px; } + +.login-dialog .user-widget .user-widget-label, +.unlock-dialog .user-widget .user-widget-label { - color: whitesmoke; } ++ color: #fafafb; } + +.login-dialog .user-widget .user-icon, +.unlock-dialog .user-widget .user-icon { - background-color: rgba(245, 245, 245, 0.13); - color: whitesmoke; } ++ background-color: rgba(250, 250, 251, 0.13); ++ color: #fafafb; } + +.login-dialog .user-widget.horizontal, +.unlock-dialog .user-widget.horizontal { + spacing: 18px; } + +.login-dialog .user-widget.vertical, +.unlock-dialog .user-widget.vertical { + spacing: 24px; } + .login-dialog .user-widget.vertical .user-widget-label, + .unlock-dialog .user-widget.vertical .user-widget-label { + font-weight: 400; + font-size: 1.818em; + text-align: center; + margin-bottom: .75em; } + .login-dialog .user-widget.vertical .user-icon, + .unlock-dialog .user-widget.vertical .user-icon { + icon-size: 160px; } + .login-dialog .user-widget.vertical .user-icon StIcon, + .unlock-dialog .user-widget.vertical .user-icon StIcon { + padding: 30px; } diff --cc subprojects/jasmine-gjs/NEWS.md index ee475af86,000000000..9a3ed298f mode 100644,000000..100644 --- a/subprojects/jasmine-gjs/NEWS.md +++ b/subprojects/jasmine-gjs/NEWS.md @@@ -1,82 -1,0 +1,110 @@@ +# Release Notes + ++## 3.10.1 - July 14, 2024 ++ ++- The internal copy of the Jasmine library has been updaetd to version 3.10.1, which brings: ++ - Support for async before/it/after functions (2.7.0) ++ - Add `nothing()` matcher (2.8.0) ++ - Add `jasmine.arrayWithExactContents()` tester (2.8.0) ++ - Support for `jasmine.any(Symbol)` (2.9.0) ++ - `jasmine.any(Object)` no longer matches null (3.0) ++ - Add `jasmine.truthy()`, `jasmine.falsy()`, `jasmine.empty()`, and `jasmine.notEmpty()` testers (3.1.0) ++ - Add `spyOnAllFunctions()` (3.2.0) ++ - Add `expectAsync()`, and `toBeResolved()` and `toBeRejected()` matchers (3.2.0) ++ - Add `withContext()` for extra debugging information (3.3.0) ++ - Add `toBeRejectedWith()` matcher (3.3.0) ++ - Support for custom async matchers with `jasmine.addAsyncMatchers()` (3.5.0) ++ - Add `jasmine.setDefaultSpyStrategy()` (3.5.0) ++ - Add `jasmine.mapContaining()` and `jasmine.setContaining()` tester (3.5.0) ++ - Add `toBeTrue()` and `toBeFalse()` matchers (3.5.0) ++ - Add `toHaveBeenCalledOnceWith()` matcher (3.6.0) ++ - Add `toHaveSize()` matcher (3.6.0) ++ - Add `toBePending()` matcher (3.6.0) ++ - Add `already` property of async specs (3.8.0) ++ - Add `spy.calls.thisFor()` (3.8.0) ++ - Add `jasmine.stringContaining()` tester (3.10.0) ++ - All other bug fixes and improvements contained in the intervening versions; see Jasmine's release notes ++- It is now possible to use Jasmine GJS as a Meson subproject. ++- Jasmine GJS now depends on GJS 1.68.0. ++- Thanks to Florian Müllner and Martín Abente Lahaye for contributing. ++ +## 2.6.4 - September 13, 2020 + +- The internal copy of the Jasmine library has been updated to version 2.6.4, which brings: + - Add `toBeNegativeInfinity()`, `toBePositiveInfinity()`, `toHaveBeenCalledBefore()` matchers + - Add `spyOnProperty()` for get/set accessors + - Add support for ES6 sets to `toContain()` and `toEqual()` + - Bug fixes included in 2.6.0, 2.6.1, 2.6.2, 2.6.3 and 2.6.4 +- Thanks to Andy Holmes for contributing. + +## 2.5.2 - September 10, 2020 + +- The internal copy of the Jasmine library has been updated to version 2.5.2, which brings: + - Add `toBeGreaterThanOrEqual()` and `toBeLessThanOrEqual()` matchers + - Bug fixes included in 2.5.0, 2.5.1 and 2.5.2 +- Thanks to Andy Holmes for contributing. + +## 2.4.1 - Sepetember 4, 2020 + +- The internal copy of the Jasmine library has been updated to version 2.4.1, which brings: + - Run jasmine's specs in random order + - Add support for returning run details for reporting randomness + - Bug fixes included in 2.4.0 +- Thanks to Andy Holmes for contributing. + +## 2.3.4 - August 30, 2020 + +- Fixed a regression in 2.3.0 which caused include paths in the config file to be treated as additional spec paths. +- The TAP reporter now outputs the test plan at the beginning instead of the end, as it should. +- The internal copy of the Jasmine library has been updated to version 2.3.4, which brings in the minor bugfixes from 2.3.1, 2.3.2, and 2.3.3 as well. +- Thanks to Andy Holmes for contributing. + +## 2.3.0 - August 25, 2020 + +- Added a `--debug` command line flag which will run the tests under GDB or the debugger of your choice. +- Added an `--interpreter` command line flag which allows using a different interpreter than whichever copy of `gjs` is in your path. +- Fixed several bugs around the loading of spec files. +- Improved error messages. +- Jasmine GJS now depends on GJS 1.58.0. +- The internal copy of the Jasmine library has been updated to 2.3.0, which brings: + - `done.fail()` for asynchronous specs. + - `toContain()` can be used for finding substrings. + - `toThrow()` can be used to check that a particular value was thrown. +- Thanks to Niv Sardi, Bart Libert and Andy Holmes for contributing. + +## 2.2.1 - June 30, 2015 + +- We now use `/usr/bin/env` to locate jasmine-gjs which allows Jasmine to be used with a development version of GJS. (Thanks to Sam Spilsbury) +- We don't exit with `System.exit()` on success, because that bypasses the GJS interpreter shutdown actions. (Thanks to Sam Spilsbury) +- The internal copy of the Jasmine library has been updated to version 2.2.1, which is a minor bugfix release. + +## 2.2.0 - May 17, 2015 + +- You can now specify file patterns to exclude using the `--exclude` + command line option. + Previously you could only do this via the config file. +- You can now set environment variables in the config file using the + `"environment"` key. +- When you specify a directory for JUnit reports to be placed in, that + directory will now be created if it doesn't already exist. +- If the argument to `--junit` is not an absolute path, then the path + will be resolved relative to the current directory. + However, you can now resolve it relative to a different path by + setting the environment variable `JASMINE_JUNIT_REPORTS_DIR`. +- The verbose and TAP reporters now report the reason why a spec has + been marked pending, if any reason has been given. +- The internal copy of the Jasmine library has been updated to version + 2.2.0, including the following features: + - the `toThrowError()` matcher to expect a particular exception + - the `jasmine.anything()` object to match anything + - the `jasmine.arrayContaining()` object to match an array containing + all of the given objects + - the `jasmine.stringMatching()` object to match a string that matches + the given regular expression or substring + - custom matching objects with `asymmetricMatch` methods + - per-spec timeouts with an extra argument to `it()`, `beforeEach()`, + and `afterEach()` + +## 2.1.3 - March 4, 2015 + +- Initial release. diff --cc subprojects/jasmine-gjs/bin/jasmine-runner.in index b2f2bb11c,000000000..1238766bc mode 100755,000000..100755 --- a/subprojects/jasmine-gjs/bin/jasmine-runner.in +++ b/subprojects/jasmine-gjs/bin/jasmine-runner.in @@@ -1,34 -1,0 +1,34 @@@ +#!/usr/bin/env -S gjs -m + +/* global jasmineImporter */ + +import GLib from 'gi://GLib'; ++import System from 'system'; + +const pkgdatadir = GLib.getenv('TEST_PKGDATADIR') ?? '@pkgdatadir@'; +const jasmineMod = GLib.getenv('TEST_JASMINE_MOD') ?? '@jasmine_mod@'; + +// Create a separate GJS importer object for Jasmine modules, so that Jasmine's +// modules are not exposed to test code (e.g. client code might have its own +// Utils module.) +// This means that all imports within Jasmine must use jasmineImporter rather +// than imports. That includes imports of Jasmine modules in the tests. It would +// be better to test a separate copy of Jasmine code, but importing most modules +// registers a GType, and we cannot register two GTypes with the same name in +// the same process. + +const oldSearchPath = imports.searchPath.slice(); // make a copy +imports.searchPath.unshift(GLib.path_get_dirname(pkgdatadir)); +globalThis.jasmineImporter = imports[jasmineMod]; +imports.searchPath = oldSearchPath; + +const base = `file://${pkgdatadir}`; + +const Command = await import(`${base}/command.js`); +const JasmineBoot = await import(`${base}/jasmineBoot.js`); + +// Do not conflict with global "jasmine" object +const _jasmine = new JasmineBoot.Jasmine(); +_jasmine.installAPI(globalThis); + - // Don't put any code after this; the return value is used as the exit code. - await Command.run(_jasmine, ARGV, 10); ++System.exit(await Command.run(_jasmine, ARGV, 10)); diff --cc subprojects/jasmine-gjs/bin/jasmine.in index ee5769257,000000000..2bf7d37c9 mode 100755,000000..100755 --- a/subprojects/jasmine-gjs/bin/jasmine.in +++ b/subprojects/jasmine-gjs/bin/jasmine.in @@@ -1,37 -1,0 +1,35 @@@ +#!/usr/bin/env -S gjs -m + +import GLib from 'gi://GLib'; - import * as System from 'system'; ++import System from 'system'; + +const pkglibexecdir = GLib.getenv('TEST_PKGLIBEXECDIR') ?? '@pkglibexecdir@'; +const pkgdatadir = GLib.getenv('TEST_PKGDATADIR') ?? '@pkgdatadir@'; + +const runnerPath = `${pkglibexecdir}/jasmine-runner`; +const base = `file://${pkgdatadir}`; + +const Config = await import(`${base}/config.js`); +const Options = await import(`${base}/options.js`); + +const [files, options] = Options.parseOptions(ARGV); + +if (options.version) { + print('Jasmine @PACKAGE_VERSION@'); + System.exit(0); +} + +const config = Config.loadConfig(options); + +// Launch Jasmine in a subprocess so we can control the environment +const launcher = Config.prepareLauncher(config, options); +let args = Config.configToArgs(config, files, options); +args.unshift(runnerPath); // argv[0] +args = Config.wrapArgs(args, config, options); +const process = launcher.spawnv(args); +process.wait(null); + - // Don't put any code after this; the return value is used as the exit code. - (function () { - if (process.get_if_exited()) - return process.get_exit_status(); - return 1; - })(); ++if (process.get_if_exited()) ++ System.exit(process.get_exit_status()); ++ ++System.exit(1); diff --cc subprojects/jasmine-gjs/debian/changelog index 02e243e9b,000000000..9db28c8ca mode 100644,000000..100644 --- a/subprojects/jasmine-gjs/debian/changelog +++ b/subprojects/jasmine-gjs/debian/changelog @@@ -1,52 -1,0 +1,58 @@@ ++jasmine-gjs (3.10.1-1) UNRELEASED; urgency=low ++ ++ * Upgrade to 3.10.1 ++ ++ -- Philip Chimento Sun, 14 Jul 2024 13:59:43 -0700 ++ +jasmine-gjs (2.6.4-1) unstable; urgency=low + + * Upgrade to 2.6.4 + + -- Andy Holmes Thu, 10 Sep 2020 21:47:34 -0700 + +jasmine-gjs (2.5.2-1) unstable; urgency=low + + * Upgrade to 2.5.2 + + -- Andy Holmes Fri, 04 Sep 2020 19:20:51 -0700 + +jasmine-gjs (2.4.1-1) unstable; urgency=low + + * Upgrade to 2.4.1 + + -- Andy Holmes Sat, 29 Aug 2020 19:46:28 -0700 + +jasmine-gjs (2.3.4-1) unstable; urgency=low + + * Upgrade to 2.3.4 + + -- Andy Holmes Wed, 26 Aug 2020 16:34:43 -0700 + +jasmine-gjs (2.3.0-1) unstable; urgency=low + + * Upgrade to 2.3.0 + * control: Bump GJS requirement to 1.58.0 + * control, rules: Meson build system + * control: Update to modern versions of standards and debhelper-compat + + -- Philip Chimento Tue, 25 Aug 2020 22:19:41 -0700 + +jasmine-gjs (2.2.1-1) unstable; urgency=low + + * Upgrade to 2.2.1 + + -- Philip Chimento Tue, 30 Jun 2015 14:24:39 -0700 + +jasmine-gjs (2.2.0-1) unstable; urgency=low + + * Upgrade to 2.2.0 + * copyright: Update copyright year of upstream Jasmine + * docs: Add new NEWS.md file + + -- Philip Chimento Mon, 18 May 2015 01:03:37 -0700 + +jasmine-gjs (2.1.3-1) unstable; urgency=low + + * Initial release + + -- Philip Chimento Sun, 01 Mar 2015 15:25:17 -0800 diff --cc subprojects/jasmine-gjs/debian/control index 117ba70d9,000000000..c5403b072 mode 100644,000000..100644 --- a/subprojects/jasmine-gjs/debian/control +++ b/subprojects/jasmine-gjs/debian/control @@@ -1,19 -1,0 +1,19 @@@ +Source: jasmine-gjs +Section: devel +Priority: optional +Maintainer: Philip Chimento +Build-Depends: debhelper-compat (= 12), + gir1.2-glib-2.0, - gjs (>= 1.58.0), - meson (>= 0.50.0) ++ gjs (>= 1.71.1), ++ meson (>= 0.58.0) +Standards-Version: 4.5.0 +Homepage: https://github.com/ptomato/jasmine-gjs + +Package: jasmine-gjs +Architecture: all +Depends: ${misc:Depends}, + gir1.2-glib-2.0, - gjs (>= 1.58.0) ++ gjs (>= 1.71.1) +Description: Behavior-driven development framework for GJS + This module allows you to run Jasmine specs for your GJS code. The output will + be displayed in your terminal. diff --cc subprojects/jasmine-gjs/jasmine-gjs.spec index 352b2e974,000000000..3b576f6fa mode 100644,000000..100644 --- a/subprojects/jasmine-gjs/jasmine-gjs.spec +++ b/subprojects/jasmine-gjs/jasmine-gjs.spec @@@ -1,64 -1,0 +1,66 @@@ +Name: jasmine-gjs - Version: 2.6.4 ++Version: 3.10.1 +Release: 1%{?dist} +Summary: A behavior-driven development framework for GJS + +License: MIT +URL: https://github.com/ptomato/jasmine-gjs - Source0: http://ptomato.name/downloads/jasmine-gjs-2.6.4.tar.xz ++Source0: https://github.com/ptomato/jasmine-gjs/releases/download/3.10.1/jasmine-gjs-3.10.1.tar.xz + +BuildArch: noarch - BuildRequires: gjs >= 1.58.0 ++BuildRequires: gjs >= 1.71.1 +BuildRequires: gobject-introspection - BuildRequires: meson >= 0.50.0 - Requires: gjs >= 1.58.0 ++BuildRequires: meson >= 0.58.0 ++Requires: gjs >= 1.71.1 +Requires: gobject-introspection + +%description +This module allows you to run Jasmine specs for your GJS code. The output will +be displayed in your terminal. + +%prep +%autosetup + + +%build +%meson +%meson_build + + +%install +%meson_install + + +%check +%meson_test + + +%files +%doc README.md +%doc NEWS.md +%doc COPYING +%doc %{_mandir}/man1/jasmine.1.gz +%{_bindir}/jasmine +%{_libexecdir}/%{name}/ +%{_datadir}/%{name}/ + + +%changelog - * Fri Sep 10 2020 Andy Holmes - 2.6.4-1 ++* Sun Jul 14 2024 Philip Chimento - 3.10.1-1 ++- Update requirements for version 3.10.1. ++* Thu Sep 10 2020 Andy Holmes - 2.6.4-1 +- Update to version 2.6.4. +* Fri Sep 4 2020 Andy Holmes - 2.5.2-1 +- Update to version 2.5.2. +* Sat Aug 29 2020 Andy Holmes - 2.4.1-1 +- Update to version 2.4.1. +* Wed Aug 26 2020 Andy Holmes - 2.3.4-1 +- Update to version 2.3.4. +* Mon Aug 24 2020 Philip Chimento - 2.3.0-1 +- Update to version 2.3.0. +* Tue Jun 30 2015 Philip Chimento - 2.2.1-1 +- Update to version 2.2.1. +* Sun May 17 2015 Philip Chimento - 2.2.0-1 +- Update to version 2.2.0. +* Wed Mar 4 2015 Philip Chimento - 2.1.3-1 +- Initial packaging. diff --cc subprojects/jasmine-gjs/lib/jasmine.js index 007712b25,000000000..6bbb4f207 mode 100644,000000..100644 --- a/subprojects/jasmine-gjs/lib/jasmine.js +++ b/subprojects/jasmine-gjs/lib/jasmine.js @@@ -1,10116 -1,0 +1,10766 @@@ - /* jscs:disable */ +/* - Copyright (c) 2008-2021 Pivotal Labs ++Copyright (c) 2008-2022 Pivotal Labs + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +// eslint-disable-next-line no-unused-vars +var getJasmineRequireObj = (function(jasmineGlobal) { + var jasmineRequire; + + if ( + typeof module !== 'undefined' && + module.exports && + typeof exports !== 'undefined' + ) { + if (typeof global !== 'undefined') { + jasmineGlobal = global; + } else { + jasmineGlobal = {}; + } + jasmineRequire = exports; + } else { + if ( + typeof window !== 'undefined' && + typeof window.toString === 'function' && + window.toString() === '[object GjsGlobal]' + ) { + jasmineGlobal = window; + } + jasmineRequire = jasmineGlobal.jasmineRequire = {}; + } + + function getJasmineRequire() { + return jasmineRequire; + } + + getJasmineRequire().core = function(jRequire) { + var j$ = {}; + + jRequire.base(j$, jasmineGlobal); + j$.util = jRequire.util(j$); + j$.errors = jRequire.errors(); + j$.formatErrorMsg = jRequire.formatErrorMsg(); + j$.Any = jRequire.Any(j$); + j$.Anything = jRequire.Anything(j$); + j$.CallTracker = jRequire.CallTracker(j$); - j$.MockDate = jRequire.MockDate(); ++ j$.MockDate = jRequire.MockDate(j$); + j$.getClearStack = jRequire.clearStack(j$); + j$.Clock = jRequire.Clock(); + j$.DelayedFunctionScheduler = jRequire.DelayedFunctionScheduler(j$); ++ j$.Deprecator = jRequire.Deprecator(j$); + j$.Env = jRequire.Env(j$); ++ j$.deprecatingThisProxy = jRequire.deprecatingThisProxy(j$); ++ j$.deprecatingSuiteProxy = jRequire.deprecatingSuiteProxy(j$); ++ j$.deprecatingSpecProxy = jRequire.deprecatingSpecProxy(j$); + j$.StackTrace = jRequire.StackTrace(j$); + j$.ExceptionFormatter = jRequire.ExceptionFormatter(j$); + j$.ExpectationFilterChain = jRequire.ExpectationFilterChain(); + j$.Expector = jRequire.Expector(j$); + j$.Expectation = jRequire.Expectation(j$); + j$.buildExpectationResult = jRequire.buildExpectationResult(j$); + j$.JsApiReporter = jRequire.JsApiReporter(j$); + j$.asymmetricEqualityTesterArgCompatShim = jRequire.asymmetricEqualityTesterArgCompatShim( + j$ + ); + j$.makePrettyPrinter = jRequire.makePrettyPrinter(j$); - j$.pp = j$.makePrettyPrinter(); ++ j$.basicPrettyPrinter_ = j$.makePrettyPrinter(); ++ Object.defineProperty(j$, 'pp', { ++ get: function() { ++ j$.getEnv().deprecated( ++ 'jasmine.pp is deprecated and will be removed in a future release. ' + ++ 'Use the pp method of the matchersUtil passed to the matcher factory ' + ++ "or the asymmetric equality tester's `asymmetricMatch` method " + ++ 'instead. See ' + ++ ' for details.' ++ ); ++ return j$.basicPrettyPrinter_; ++ } ++ }); + j$.MatchersUtil = jRequire.MatchersUtil(j$); - j$.matchersUtil = new j$.MatchersUtil({ ++ var staticMatchersUtil = new j$.MatchersUtil({ + customTesters: [], - pp: j$.pp ++ pp: j$.basicPrettyPrinter_ ++ }); ++ Object.defineProperty(j$, 'matchersUtil', { ++ get: function() { ++ j$.getEnv().deprecated( ++ 'jasmine.matchersUtil is deprecated and will be removed ' + ++ 'in a future release. Use the instance passed to the matcher factory or ' + ++ "the asymmetric equality tester's `asymmetricMatch` method instead. " + ++ 'See for details.' ++ ); ++ return staticMatchersUtil; ++ } + }); + + j$.ObjectContaining = jRequire.ObjectContaining(j$); + j$.ArrayContaining = jRequire.ArrayContaining(j$); + j$.ArrayWithExactContents = jRequire.ArrayWithExactContents(j$); + j$.MapContaining = jRequire.MapContaining(j$); + j$.SetContaining = jRequire.SetContaining(j$); + j$.QueueRunner = jRequire.QueueRunner(j$); + j$.ReportDispatcher = jRequire.ReportDispatcher(j$); + j$.Spec = jRequire.Spec(j$); + j$.Spy = jRequire.Spy(j$); + j$.SpyFactory = jRequire.SpyFactory(j$); + j$.SpyRegistry = jRequire.SpyRegistry(j$); + j$.SpyStrategy = jRequire.SpyStrategy(j$); + j$.StringMatching = jRequire.StringMatching(j$); + j$.StringContaining = jRequire.StringContaining(j$); + j$.UserContext = jRequire.UserContext(j$); + j$.Suite = jRequire.Suite(j$); + j$.Timer = jRequire.Timer(); + j$.TreeProcessor = jRequire.TreeProcessor(); + j$.version = jRequire.version(); + j$.Order = jRequire.Order(); + j$.DiffBuilder = jRequire.DiffBuilder(j$); + j$.NullDiffBuilder = jRequire.NullDiffBuilder(j$); + j$.ObjectPath = jRequire.ObjectPath(j$); + j$.MismatchTree = jRequire.MismatchTree(j$); + j$.GlobalErrors = jRequire.GlobalErrors(j$); + + j$.Truthy = jRequire.Truthy(j$); + j$.Falsy = jRequire.Falsy(j$); + j$.Empty = jRequire.Empty(j$); + j$.NotEmpty = jRequire.NotEmpty(j$); + + j$.matchers = jRequire.requireMatchers(jRequire, j$); + j$.asyncMatchers = jRequire.requireAsyncMatchers(jRequire, j$); + + return j$; + }; + + return getJasmineRequire; +})(this); + +getJasmineRequireObj().requireMatchers = function(jRequire, j$) { + var availableMatchers = [ + 'nothing', + 'toBe', + 'toBeCloseTo', + 'toBeDefined', + 'toBeInstanceOf', + 'toBeFalse', + 'toBeFalsy', + 'toBeGreaterThan', + 'toBeGreaterThanOrEqual', + 'toBeLessThan', + 'toBeLessThanOrEqual', + 'toBeNaN', + 'toBeNegativeInfinity', + 'toBeNull', + 'toBePositiveInfinity', + 'toBeTrue', + 'toBeTruthy', + 'toBeUndefined', + 'toContain', + 'toEqual', + 'toHaveSize', + 'toHaveBeenCalled', + 'toHaveBeenCalledBefore', + 'toHaveBeenCalledOnceWith', + 'toHaveBeenCalledTimes', + 'toHaveBeenCalledWith', + 'toHaveClass', + 'toMatch', + 'toThrow', + 'toThrowError', + 'toThrowMatching' + ], + matchers = {}; + + for (var i = 0; i < availableMatchers.length; i++) { + var name = availableMatchers[i]; + matchers[name] = jRequire[name](j$); + } + + return matchers; +}; + +getJasmineRequireObj().base = function(j$, jasmineGlobal) { + j$.unimplementedMethod_ = function() { + throw new Error('unimplemented method'); + }; + + /** + * Maximum object depth the pretty printer will print to. + * Set this to a lower value to speed up pretty printing if you have large objects. + * @name jasmine.MAX_PRETTY_PRINT_DEPTH + * @default 8 + * @since 1.3.0 + */ + j$.MAX_PRETTY_PRINT_DEPTH = 8; + /** + * Maximum number of array elements to display when pretty printing objects. + * This will also limit the number of keys and values displayed for an object. + * Elements past this number will be ellipised. + * @name jasmine.MAX_PRETTY_PRINT_ARRAY_LENGTH + * @default 50 + * @since 2.7.0 + */ + j$.MAX_PRETTY_PRINT_ARRAY_LENGTH = 50; + /** + * Maximum number of characters to display when pretty printing objects. + * Characters past this number will be ellipised. + * @name jasmine.MAX_PRETTY_PRINT_CHARS + * @default 100 + * @since 2.9.0 + */ + j$.MAX_PRETTY_PRINT_CHARS = 1000; + /** + * Default number of milliseconds Jasmine will wait for an asynchronous spec, + * before, or after function to complete. This can be overridden on a case by + * case basis by passing a time limit as the third argument to {@link it}, + * {@link beforeEach}, {@link afterEach}, {@link beforeAll}, or + * {@link afterAll}. The value must be no greater than the largest number of + * milliseconds supported by setTimeout, which is usually 2147483647. + * + * While debugging tests, you may want to set this to a large number (or pass + * a large number to one of the functions mentioned above) so that Jasmine + * does not move on to after functions or the next spec while you're debugging. + * @name jasmine.DEFAULT_TIMEOUT_INTERVAL + * @default 5000 + * @since 1.3.0 + */ + var DEFAULT_TIMEOUT_INTERVAL = 5000; + Object.defineProperty(j$, 'DEFAULT_TIMEOUT_INTERVAL', { + get: function() { + return DEFAULT_TIMEOUT_INTERVAL; + }, + set: function(newValue) { + j$.util.validateTimeout(newValue, 'jasmine.DEFAULT_TIMEOUT_INTERVAL'); + DEFAULT_TIMEOUT_INTERVAL = newValue; + } + }); + + j$.getGlobal = function() { + return jasmineGlobal; + }; + + /** + * Get the currently booted Jasmine Environment. + * + * @name jasmine.getEnv + * @since 1.3.0 + * @function + * @return {Env} + */ + j$.getEnv = function(options) { + var env = (j$.currentEnv_ = j$.currentEnv_ || new j$.Env(options)); + //jasmine. singletons in here (setTimeout blah blah). + return env; + }; + + j$.isArray_ = function(value) { + return j$.isA_('Array', value); + }; + + j$.isObject_ = function(value) { + return ( + !j$.util.isUndefined(value) && value !== null && j$.isA_('Object', value) + ); + }; + + j$.isString_ = function(value) { + return j$.isA_('String', value); + }; + + j$.isNumber_ = function(value) { + return j$.isA_('Number', value); + }; + + j$.isFunction_ = function(value) { + return j$.isA_('Function', value); + }; + + j$.isAsyncFunction_ = function(value) { + return j$.isA_('AsyncFunction', value); + }; + + j$.isGeneratorFunction_ = function(value) { + return j$.isA_('GeneratorFunction', value); + }; + + j$.isTypedArray_ = function(value) { + return ( + j$.isA_('Float32Array', value) || + j$.isA_('Float64Array', value) || + j$.isA_('Int16Array', value) || + j$.isA_('Int32Array', value) || + j$.isA_('Int8Array', value) || + j$.isA_('Uint16Array', value) || + j$.isA_('Uint32Array', value) || + j$.isA_('Uint8Array', value) || + j$.isA_('Uint8ClampedArray', value) + ); + }; + + j$.isA_ = function(typeName, value) { + return j$.getType_(value) === '[object ' + typeName + ']'; + }; + + j$.isError_ = function(value) { + if (!value) { + return false; + } + + if (value instanceof Error) { + return true; + } + if ( + typeof window !== 'undefined' && + typeof window.trustedTypes !== 'undefined' + ) { + return ( + typeof value.stack === 'string' && typeof value.message === 'string' + ); + } + if (value && value.constructor && value.constructor.constructor) { + var valueGlobal = value.constructor.constructor('return this'); + if (j$.isFunction_(valueGlobal)) { + valueGlobal = valueGlobal(); + } + + if (valueGlobal.Error && value instanceof valueGlobal.Error) { + return true; + } + } + return false; + }; + + j$.isAsymmetricEqualityTester_ = function(obj) { - return obj?.asymmetricMatch ? j$.isA_('Function', obj.asymmetricMatch) : false; ++ return obj ? j$.isA_('Function', obj.asymmetricMatch) : false; + }; + + j$.getType_ = function(value) { + return Object.prototype.toString.apply(value); + }; + + j$.isDomNode = function(obj) { + // Node is a function, because constructors + return typeof jasmineGlobal.Node !== 'undefined' + ? obj instanceof jasmineGlobal.Node + : obj !== null && + typeof obj === 'object' && + typeof obj.nodeType === 'number' && + typeof obj.nodeName === 'string'; + // return obj.nodeType > 0; + }; + + j$.isMap = function(obj) { + return ( + obj !== null && + typeof obj !== 'undefined' && + typeof jasmineGlobal.Map !== 'undefined' && + obj.constructor === jasmineGlobal.Map + ); + }; + + j$.isSet = function(obj) { + return ( + obj !== null && + typeof obj !== 'undefined' && + typeof jasmineGlobal.Set !== 'undefined' && + obj.constructor === jasmineGlobal.Set + ); + }; + + j$.isWeakMap = function(obj) { + return ( + obj !== null && + typeof obj !== 'undefined' && + typeof jasmineGlobal.WeakMap !== 'undefined' && + obj.constructor === jasmineGlobal.WeakMap + ); + }; + + j$.isURL = function(obj) { + return ( + obj !== null && + typeof obj !== 'undefined' && + typeof jasmineGlobal.URL !== 'undefined' && + obj.constructor === jasmineGlobal.URL + ); + }; + + j$.isDataView = function(obj) { + return ( + obj !== null && + typeof obj !== 'undefined' && + typeof jasmineGlobal.DataView !== 'undefined' && + obj.constructor === jasmineGlobal.DataView + ); + }; + + j$.isPromise = function(obj) { + return ( + typeof jasmineGlobal.Promise !== 'undefined' && + !!obj && + obj.constructor === jasmineGlobal.Promise + ); + }; + + j$.isPromiseLike = function(obj) { + return !!obj && j$.isFunction_(obj.then); + }; + + j$.fnNameFor = function(func) { + if (func.name) { + return func.name; + } + + var matches = + func.toString().match(/^\s*function\s*(\w+)\s*\(/) || + func.toString().match(/^\s*\[object\s*(\w+)Constructor\]/); + + return matches ? matches[1] : ''; + }; + + j$.isPending_ = function(promise) { + var sentinel = {}; + // eslint-disable-next-line compat/compat + return Promise.race([promise, Promise.resolve(sentinel)]).then( + function(result) { + return result === sentinel; + }, + function() { + return false; + } + ); + }; + + /** + * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared is an instance of the specified class/constructor. + * @name jasmine.any + * @since 1.3.0 + * @function + * @param {Constructor} clazz - The constructor to check against. + */ + j$.any = function(clazz) { + return new j$.Any(clazz); + }; + + /** + * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared is not `null` and not `undefined`. + * @name jasmine.anything + * @since 2.2.0 + * @function + */ + j$.anything = function() { + return new j$.Anything(); + }; + + /** + * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared is `true` or anything truthy. + * @name jasmine.truthy + * @since 3.1.0 + * @function + */ + j$.truthy = function() { + return new j$.Truthy(); + }; + + /** + * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared is `null`, `undefined`, `0`, `false` or anything falsey. + * @name jasmine.falsy + * @since 3.1.0 + * @function + */ + j$.falsy = function() { + return new j$.Falsy(); + }; + + /** + * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared is empty. + * @name jasmine.empty + * @since 3.1.0 + * @function + */ + j$.empty = function() { + return new j$.Empty(); + }; + + /** + * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared is not empty. + * @name jasmine.notEmpty + * @since 3.1.0 + * @function + */ + j$.notEmpty = function() { + return new j$.NotEmpty(); + }; + + /** + * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared contains at least the keys and values. + * @name jasmine.objectContaining + * @since 1.3.0 + * @function + * @param {Object} sample - The subset of properties that _must_ be in the actual. + */ + j$.objectContaining = function(sample) { + return new j$.ObjectContaining(sample); + }; + + /** + * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value is a `String` that matches the `RegExp` or `String`. + * @name jasmine.stringMatching + * @since 2.2.0 + * @function + * @param {RegExp|String} expected + */ + j$.stringMatching = function(expected) { + return new j$.StringMatching(expected); + }; + + /** + * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value is a `String` that contains the specified `String`. + * @name jasmine.stringContaining + * @since 3.10.0 + * @function + * @param {String} expected + */ + j$.stringContaining = function(expected) { + return new j$.StringContaining(expected); + }; + + /** + * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value is an `Array` that contains at least the elements in the sample. + * @name jasmine.arrayContaining + * @since 2.2.0 + * @function + * @param {Array} sample + */ + j$.arrayContaining = function(sample) { + return new j$.ArrayContaining(sample); + }; + + /** + * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value is an `Array` that contains all of the elements in the sample in any order. + * @name jasmine.arrayWithExactContents + * @since 2.8.0 + * @function + * @param {Array} sample + */ + j$.arrayWithExactContents = function(sample) { + return new j$.ArrayWithExactContents(sample); + }; + + /** + * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if every key/value pair in the sample passes the deep equality comparison + * with at least one key/value pair in the actual value being compared + * @name jasmine.mapContaining + * @since 3.5.0 + * @function + * @param {Map} sample - The subset of items that _must_ be in the actual. + */ + j$.mapContaining = function(sample) { + return new j$.MapContaining(sample); + }; + + /** + * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if every item in the sample passes the deep equality comparison + * with at least one item in the actual value being compared + * @name jasmine.setContaining + * @since 3.5.0 + * @function + * @param {Set} sample - The subset of items that _must_ be in the actual. + */ + j$.setContaining = function(sample) { + return new j$.SetContaining(sample); + }; + + /** + * Determines whether the provided function is a Jasmine spy. + * @name jasmine.isSpy + * @since 2.0.0 + * @function + * @param {Function} putativeSpy - The function to check. + * @return {Boolean} + */ + j$.isSpy = function(putativeSpy) { - if (!putativeSpy || !putativeSpy.and) { ++ if (!putativeSpy) { + return false; + } + return ( + putativeSpy.and instanceof j$.SpyStrategy && + putativeSpy.calls instanceof j$.CallTracker + ); + }; +}; + +getJasmineRequireObj().util = function(j$) { + var util = {}; + + util.inherit = function(childClass, parentClass) { + var Subclass = function() {}; + Subclass.prototype = parentClass.prototype; + childClass.prototype = new Subclass(); + }; + + util.argsToArray = function(args) { + var arrayOfArgs = []; + for (var i = 0; i < args.length; i++) { + arrayOfArgs.push(args[i]); + } + return arrayOfArgs; + }; + + util.isUndefined = function(obj) { + return obj === void 0; + }; + + util.arrayContains = function(array, search) { + var i = array.length; + while (i--) { + if (array[i] === search) { + return true; + } + } + return false; + }; + + util.clone = function(obj) { + if (Object.prototype.toString.apply(obj) === '[object Array]') { + return obj.slice(); + } + + var cloned = {}; + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + cloned[prop] = obj[prop]; + } + } + + return cloned; + }; + + util.cloneArgs = function(args) { + var clonedArgs = []; + var argsAsArray = j$.util.argsToArray(args); + for (var i = 0; i < argsAsArray.length; i++) { + var str = Object.prototype.toString.apply(argsAsArray[i]), + primitives = /^\[object (Boolean|String|RegExp|Number)/; + + // All falsey values are either primitives, `null`, or `undefined. + if (!argsAsArray[i] || str.match(primitives)) { + clonedArgs.push(argsAsArray[i]); + } else { + clonedArgs.push(j$.util.clone(argsAsArray[i])); + } + } + return clonedArgs; + }; + + util.getPropertyDescriptor = function(obj, methodName) { + var descriptor, + proto = obj; + + do { + descriptor = Object.getOwnPropertyDescriptor(proto, methodName); + proto = Object.getPrototypeOf(proto); + } while (!descriptor && proto); + + return descriptor; + }; + + util.objectDifference = function(obj, toRemove) { + var diff = {}; + + for (var key in obj) { + if (util.has(obj, key) && !util.has(toRemove, key)) { + diff[key] = obj[key]; + } + } + + return diff; + }; + + util.has = function(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); + }; + + util.errorWithStack = function errorWithStack() { + // Don't throw and catch if we don't have to, because it makes it harder + // for users to debug their code with exception breakpoints. + var error = new Error(); + + if (error.stack) { + return error; + } + + // But some browsers (e.g. Phantom) only provide a stack trace if we throw. + try { + throw new Error(); + } catch (e) { + return e; + } + }; + + function callerFile() { + var trace = new j$.StackTrace(util.errorWithStack()); + return trace.frames[2].file; + } + + util.jasmineFile = (function() { + var result; + + return function() { + if (!result) { + result = callerFile(); + } + + return result; + }; + })(); + + function StopIteration() {} + StopIteration.prototype = Object.create(Error.prototype); + StopIteration.prototype.constructor = StopIteration; + + // useful for maps and sets since `forEach` is the only IE11-compatible way to iterate them + util.forEachBreakable = function(iterable, iteratee) { + function breakLoop() { + throw new StopIteration(); + } + + try { + iterable.forEach(function(value, key) { + iteratee(breakLoop, value, key, iterable); + }); + } catch (error) { + if (!(error instanceof StopIteration)) throw error; + } + }; + + util.validateTimeout = function(timeout, msgPrefix) { + // Timeouts are implemented with setTimeout, which only supports a limited + // range of values. The limit is unspecified, as is the behavior when it's + // exceeded. But on all currently supported JS runtimes, setTimeout calls + // the callback immediately when the timeout is greater than 2147483647 + // (the maximum value of a signed 32 bit integer). + var max = 2147483647; + + if (timeout > max) { + throw new Error( + (msgPrefix || 'Timeout value') + ' cannot be greater than ' + max + ); + } + }; + + return util; +}; + +getJasmineRequireObj().Spec = function(j$) { + /** + * @interface Spec + * @see Configuration#specFilter + * @since 2.0.0 + */ + function Spec(attrs) { + this.expectationFactory = attrs.expectationFactory; + this.asyncExpectationFactory = attrs.asyncExpectationFactory; + this.resultCallback = attrs.resultCallback || function() {}; + /** + * The unique ID of this spec. + * @name Spec#id + * @readonly + * @type {string} + * @since 2.0.0 + */ + this.id = attrs.id; + /** + * The description passed to the {@link it} that created this spec. + * @name Spec#description + * @readonly + * @type {string} + * @since 2.0.0 + */ + this.description = attrs.description || ''; + this.queueableFn = attrs.queueableFn; + this.beforeAndAfterFns = + attrs.beforeAndAfterFns || + function() { + return { befores: [], afters: [] }; + }; + this.userContext = + attrs.userContext || + function() { + return {}; + }; + this.onStart = attrs.onStart || function() {}; + this.autoCleanClosures = + attrs.autoCleanClosures === undefined ? true : !!attrs.autoCleanClosures; + this.getSpecName = + attrs.getSpecName || + function() { + return ''; + }; + this.expectationResultFactory = + attrs.expectationResultFactory || function() {}; ++ this.deprecated = attrs.deprecated || function() {}; + this.queueRunnerFactory = attrs.queueRunnerFactory || function() {}; + this.catchingExceptions = + attrs.catchingExceptions || + function() { + return true; + }; + this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure; + this.timer = attrs.timer || new j$.Timer(); + + if (!this.queueableFn.fn) { + this.exclude(); + } + + /** + * @typedef SpecResult + * @property {Int} id - The unique id of this spec. + * @property {String} description - The description passed to the {@link it} that created this spec. + * @property {String} fullName - The full description including all ancestors of this spec. + * @property {Expectation[]} failedExpectations - The list of expectations that failed during execution of this spec. + * @property {Expectation[]} passedExpectations - The list of expectations that passed during execution of this spec. + * @property {Expectation[]} deprecationWarnings - The list of deprecation warnings that occurred during execution this spec. + * @property {String} pendingReason - If the spec is {@link pending}, this will be the reason. + * @property {String} status - Once the spec has completed, this string represents the pass/fail status of this spec. + * @property {number} duration - The time in ms used by the spec execution, including any before/afterEach. + * @property {Object} properties - User-supplied properties, if any, that were set using {@link Env#setSpecProperty} + * @since 2.0.0 +x */ + this.result = { + id: this.id, + description: this.description, + fullName: this.getFullName(), + failedExpectations: [], + passedExpectations: [], + deprecationWarnings: [], + pendingReason: '', + duration: null, + properties: null + }; + } + + Spec.prototype.addExpectationResult = function(passed, data, isError) { + var expectationResult = this.expectationResultFactory(data); + if (passed) { + this.result.passedExpectations.push(expectationResult); + } else { + this.result.failedExpectations.push(expectationResult); + + if (this.throwOnExpectationFailure && !isError) { + throw new j$.errors.ExpectationFailed(); + } + } + }; + + Spec.prototype.setSpecProperty = function(key, value) { + this.result.properties = this.result.properties || {}; + this.result.properties[key] = value; + }; + + Spec.prototype.expect = function(actual) { + return this.expectationFactory(actual, this); + }; + + Spec.prototype.expectAsync = function(actual) { + return this.asyncExpectationFactory(actual, this); + }; + + Spec.prototype.execute = function(onComplete, excluded, failSpecWithNoExp) { + var self = this; + + var onStart = { + fn: function(done) { + self.timer.start(); + self.onStart(self, done); + } + }; + + var complete = { + fn: function(done) { + if (self.autoCleanClosures) { + self.queueableFn.fn = null; + } + self.result.status = self.status(excluded, failSpecWithNoExp); + self.result.duration = self.timer.elapsed(); + self.resultCallback(self.result, done); + } + }; + + var fns = this.beforeAndAfterFns(); + var regularFns = fns.befores.concat(this.queueableFn); + + var runnerConfig = { + isLeaf: true, + queueableFns: regularFns, + cleanupFns: fns.afters, + onException: function() { + self.onException.apply(self, arguments); + }, - onComplete: function() { - onComplete( - self.result.status === 'failed' && - new j$.StopExecutionError('spec failed') ++ onMultipleDone: function() { ++ // Issue a deprecation. Include the context ourselves and pass ++ // ignoreRunnable: true, since getting here always means that we've already ++ // moved on and the current runnable isn't the one that caused the problem. ++ self.deprecated( ++ "An asynchronous function called its 'done' " + ++ 'callback more than once. This is a bug in the spec, beforeAll, ' + ++ 'beforeEach, afterAll, or afterEach function in question. This will ' + ++ 'be treated as an error in a future version. See' + ++ ' ' + ++ 'for more information.\n' + ++ '(in spec: ' + ++ self.getFullName() + ++ ')', ++ { ignoreRunnable: true } + ); + }, - userContext: this.userContext() ++ onComplete: function() { ++ if (self.result.status === 'failed') { ++ onComplete(new j$.StopExecutionError('spec failed')); ++ } else { ++ onComplete(); ++ } ++ }, ++ userContext: this.userContext(), ++ runnableName: this.getFullName.bind(this) + }; + + if (this.markedPending || excluded === true) { + runnerConfig.queueableFns = []; + runnerConfig.cleanupFns = []; + } + + runnerConfig.queueableFns.unshift(onStart); + runnerConfig.cleanupFns.push(complete); + + this.queueRunnerFactory(runnerConfig); + }; + + Spec.prototype.reset = function() { + /** + * @typedef SpecResult + * @property {Int} id - The unique id of this spec. + * @property {String} description - The description passed to the {@link it} that created this spec. + * @property {String} fullName - The full description including all ancestors of this spec. + * @property {Expectation[]} failedExpectations - The list of expectations that failed during execution of this spec. + * @property {Expectation[]} passedExpectations - The list of expectations that passed during execution of this spec. + * @property {Expectation[]} deprecationWarnings - The list of deprecation warnings that occurred during execution this spec. + * @property {String} pendingReason - If the spec is {@link pending}, this will be the reason. + * @property {String} status - Once the spec has completed, this string represents the pass/fail status of this spec. + * @property {number} duration - The time in ms used by the spec execution, including any before/afterEach. + * @property {Object} properties - User-supplied properties, if any, that were set using {@link Env#setSpecProperty} + * @since 2.0.0 + */ + this.result = { + id: this.id, + description: this.description, + fullName: this.getFullName(), + failedExpectations: [], + passedExpectations: [], + deprecationWarnings: [], + pendingReason: this.excludeMessage, + duration: null, + properties: null, + trace: null + }; + this.markedPending = this.markedExcluding; + }; + + Spec.prototype.onException = function onException(e) { + if (Spec.isPendingSpecException(e)) { + this.pend(extractCustomPendingMessage(e)); + return; + } + + if (e instanceof j$.errors.ExpectationFailed) { + return; + } + + this.addExpectationResult( + false, + { + matcherName: '', + passed: false, + expected: '', + actual: '', + error: e + }, + true + ); + }; + + /* + * Marks state as pending + * @param {string} [message] An optional reason message + */ + Spec.prototype.pend = function(message) { + this.markedPending = true; + if (message) { + this.result.pendingReason = message; + } + }; + + /* + * Like {@link Spec#pend}, but pending state will survive {@link Spec#reset} + * Useful for fit, xit, where pending state remains. + * @param {string} [message] An optional reason message + */ + Spec.prototype.exclude = function(message) { + this.markedExcluding = true; + if (this.message) { + this.excludeMessage = message; + } + this.pend(message); + }; + + Spec.prototype.getResult = function() { + this.result.status = this.status(); + return this.result; + }; + + Spec.prototype.status = function(excluded, failSpecWithNoExpectations) { + if (excluded === true) { + return 'excluded'; + } + + if (this.markedPending) { + return 'pending'; + } + + if ( + this.result.failedExpectations.length > 0 || + (failSpecWithNoExpectations && + this.result.failedExpectations.length + + this.result.passedExpectations.length === + 0) + ) { + return 'failed'; + } + + return 'passed'; + }; + + /** + * The full description including all ancestors of this spec. + * @name Spec#getFullName + * @function + * @returns {string} + * @since 2.0.0 + */ + Spec.prototype.getFullName = function() { + return this.getSpecName(this); + }; + + Spec.prototype.addDeprecationWarning = function(deprecation) { + if (typeof deprecation === 'string') { + deprecation = { message: deprecation }; + } + this.result.deprecationWarnings.push( + this.expectationResultFactory(deprecation) + ); + }; + + var extractCustomPendingMessage = function(e) { + var fullMessage = e.toString(), + boilerplateStart = fullMessage.indexOf(Spec.pendingSpecExceptionMessage), + boilerplateEnd = + boilerplateStart + Spec.pendingSpecExceptionMessage.length; + + return fullMessage.substr(boilerplateEnd); + }; + + Spec.pendingSpecExceptionMessage = '=> marked Pending'; + + Spec.isPendingSpecException = function(e) { + return !!( + e && + e.toString && + e.toString().indexOf(Spec.pendingSpecExceptionMessage) !== -1 + ); + }; + + return Spec; +}; + +if (typeof window == void 0 && typeof exports == 'object') { + /* globals exports */ + exports.Spec = jasmineRequire.Spec; +} + +/*jshint bitwise: false*/ + +getJasmineRequireObj().Order = function() { + function Order(options) { + this.random = 'random' in options ? options.random : true; + var seed = (this.seed = options.seed || generateSeed()); + this.sort = this.random ? randomOrder : naturalOrder; + + function naturalOrder(items) { + return items; + } + + function randomOrder(items) { + var copy = items.slice(); + copy.sort(function(a, b) { + return jenkinsHash(seed + a.id) - jenkinsHash(seed + b.id); + }); + return copy; + } + + function generateSeed() { + return String(Math.random()).slice(-5); + } + + // Bob Jenkins One-at-a-Time Hash algorithm is a non-cryptographic hash function + // used to get a different output when the key changes slightly. + // We use your return to sort the children randomly in a consistent way when + // used in conjunction with a seed + + function jenkinsHash(key) { + var hash, i; + for (hash = i = 0; i < key.length; ++i) { + hash += key.charCodeAt(i); + hash += hash << 10; + hash ^= hash >> 6; + } + hash += hash << 3; + hash ^= hash >> 11; + hash += hash << 15; + return hash; + } + } + + return Order; +}; + +getJasmineRequireObj().Env = function(j$) { + /** + * @class Env + * @since 2.0.0 + * @classdesc The Jasmine environment.
+ * _Note:_ Do not construct this directly. You can obtain the Env instance by + * calling {@link jasmine.getEnv}. + * @hideconstructor + */ + function Env(options) { + options = options || {}; + + var self = this; + var global = options.global || j$.getGlobal(); + var customPromise; + + var totalSpecsDefined = 0; + + var realSetTimeout = global.setTimeout; + var realClearTimeout = global.clearTimeout; + var clearStack = j$.getClearStack(global); + this.clock = new j$.Clock( + global, + function() { + return new j$.DelayedFunctionScheduler(); + }, + new j$.MockDate(global) + ); + + var runnableResources = {}; + + var currentSpec = null; + var currentlyExecutingSuites = []; + var currentDeclarationSuite = null; + var hasFailures = false; + + /** + * This represents the available options to configure Jasmine. + * Options that are not provided will use their default values. + * @see Env#configure + * @interface Configuration + * @since 3.3.0 + */ + var config = { + /** + * Whether to randomize spec execution order + * @name Configuration#random + * @since 3.3.0 + * @type Boolean + * @default true + */ + random: true, + /** + * Seed to use as the basis of randomization. + * Null causes the seed to be determined randomly at the start of execution. + * @name Configuration#seed + * @since 3.3.0 + * @type (number|string) + * @default null + */ + seed: null, + /** + * Whether to stop execution of the suite after the first spec failure + * @name Configuration#failFast + * @since 3.3.0 + * @type Boolean + * @default false + * @deprecated Use the `stopOnSpecFailure` config property instead. + */ + failFast: false, + /** + * Whether to stop execution of the suite after the first spec failure + * @name Configuration#stopOnSpecFailure + * @since 3.9.0 + * @type Boolean + * @default false + */ + stopOnSpecFailure: false, + /** + * Whether to fail the spec if it ran no expectations. By default + * a spec that ran no expectations is reported as passed. Setting this + * to true will report such spec as a failure. + * @name Configuration#failSpecWithNoExpectations + * @since 3.5.0 + * @type Boolean + * @default false + */ + failSpecWithNoExpectations: false, + /** + * Whether to cause specs to only have one expectation failure. + * @name Configuration#oneFailurePerSpec + * @since 3.3.0 + * @type Boolean + * @default false + * @deprecated Use the `stopSpecOnExpectationFailure` config property instead. + */ + oneFailurePerSpec: false, + /** + * Whether to cause specs to only have one expectation failure. + * @name Configuration#stopSpecOnExpectationFailure + * @since 3.3.0 + * @type Boolean + * @default false + */ + stopSpecOnExpectationFailure: false, + /** + * A function that takes a spec and returns true if it should be executed + * or false if it should be skipped. + * @callback SpecFilter + * @param {Spec} spec - The spec that the filter is being applied to. + * @return boolean + */ + /** + * Function to use to filter specs + * @name Configuration#specFilter + * @since 3.3.0 + * @type SpecFilter + * @default A function that always returns true. + */ + specFilter: function() { + return true; + }, + /** + * Whether or not reporters should hide disabled specs from their output. + * Currently only supported by Jasmine's HTMLReporter + * @name Configuration#hideDisabled + * @since 3.3.0 + * @type Boolean + * @default false + */ + hideDisabled: false, + /** + * Set to provide a custom promise library that Jasmine will use if it needs + * to create a promise. If not set, it will default to whatever global Promise + * library is available (if any). + * @name Configuration#Promise + * @since 3.5.0 + * @type function + * @default undefined ++ * @deprecated In a future version, Jasmine will ignore the Promise config ++ * property and always create native promises instead. + */ + Promise: undefined, + /** + * Clean closures when a suite is done running (done by clearing the stored function reference). + * This prevents memory leaks, but you won't be able to run jasmine multiple times. + * @name Configuration#autoCleanClosures + * @since 3.10.0 + * @type boolean + * @default true + */ - autoCleanClosures: true ++ autoCleanClosures: true, ++ /** ++ * Whether or not to issue warnings for certain deprecated functionality ++ * every time it's used. If not set or set to false, deprecation warnings ++ * for methods that tend to be called frequently will be issued only once ++ * or otherwise throttled to to prevent the suite output from being flooded ++ * with warnings. ++ * @name Configuration#verboseDeprecations ++ * @since 3.6.0 ++ * @type Boolean ++ * @default false ++ */ ++ verboseDeprecations: false + }; + + var currentSuite = function() { + return currentlyExecutingSuites[currentlyExecutingSuites.length - 1]; + }; + + var currentRunnable = function() { + return currentSpec || currentSuite(); + }; + + var globalErrors = null; + + var installGlobalErrors = function() { + if (globalErrors) { + return; + } + + globalErrors = new j$.GlobalErrors(); + globalErrors.install(); + }; + + if (!options.suppressLoadErrors) { + installGlobalErrors(); + globalErrors.pushListener(function( + message, + filename, + lineno, + colNo, + err + ) { + topSuite.result.failedExpectations.push({ + passed: false, + globalErrorType: 'load', + message: message, + stack: err && err.stack, + filename: filename, + lineno: lineno + }); + }); + } + + /** + * Configure your jasmine environment + * @name Env#configure + * @since 3.3.0 + * @argument {Configuration} configuration + * @function + */ + this.configure = function(configuration) { + var booleanProps = [ + 'random', + 'failSpecWithNoExpectations', + 'hideDisabled', + 'autoCleanClosures' + ]; + + booleanProps.forEach(function(prop) { + if (typeof configuration[prop] !== 'undefined') { + config[prop] = !!configuration[prop]; + } + }); + + if (typeof configuration.failFast !== 'undefined') { ++ // We can't unconditionally issue a warning here because then users who ++ // get the configuration from Jasmine, modify it, and pass it back would ++ // see the warning. ++ if (configuration.failFast !== config.failFast) { ++ this.deprecated( ++ 'The `failFast` config property is deprecated and will be removed ' + ++ 'in a future version of Jasmine. Please use `stopOnSpecFailure` ' + ++ 'instead.', ++ { ignoreRunnable: true } ++ ); ++ } ++ + if (typeof configuration.stopOnSpecFailure !== 'undefined') { + if (configuration.stopOnSpecFailure !== configuration.failFast) { + throw new Error( + 'stopOnSpecFailure and failFast are aliases for ' + + "each other. Don't set failFast if you also set stopOnSpecFailure." + ); + } + } + + config.failFast = configuration.failFast; + config.stopOnSpecFailure = configuration.failFast; + } else if (typeof configuration.stopOnSpecFailure !== 'undefined') { + config.failFast = configuration.stopOnSpecFailure; + config.stopOnSpecFailure = configuration.stopOnSpecFailure; + } + + if (typeof configuration.oneFailurePerSpec !== 'undefined') { ++ // We can't unconditionally issue a warning here because then users who ++ // get the configuration from Jasmine, modify it, and pass it back would ++ // see the warning. ++ if (configuration.oneFailurePerSpec !== config.oneFailurePerSpec) { ++ this.deprecated( ++ 'The `oneFailurePerSpec` config property is deprecated and will be ' + ++ 'removed in a future version of Jasmine. Please use ' + ++ '`stopSpecOnExpectationFailure` instead.', ++ { ignoreRunnable: true } ++ ); ++ } ++ + if (typeof configuration.stopSpecOnExpectationFailure !== 'undefined') { + if ( + configuration.stopSpecOnExpectationFailure !== + configuration.oneFailurePerSpec + ) { + throw new Error( + 'stopSpecOnExpectationFailure and oneFailurePerSpec are aliases for ' + + "each other. Don't set oneFailurePerSpec if you also set stopSpecOnExpectationFailure." + ); + } + } + + config.oneFailurePerSpec = configuration.oneFailurePerSpec; + config.stopSpecOnExpectationFailure = configuration.oneFailurePerSpec; + } else if ( + typeof configuration.stopSpecOnExpectationFailure !== 'undefined' + ) { + config.oneFailurePerSpec = configuration.stopSpecOnExpectationFailure; + config.stopSpecOnExpectationFailure = + configuration.stopSpecOnExpectationFailure; + } + + if (configuration.specFilter) { + config.specFilter = configuration.specFilter; + } + + if (typeof configuration.seed !== 'undefined') { + config.seed = configuration.seed; + } + + // Don't use hasOwnProperty to check for Promise existence because Promise + // can be initialized to undefined, either explicitly or by using the + // object returned from Env#configuration. In particular, Karma does this. + if (configuration.Promise) { + if ( + typeof configuration.Promise.resolve === 'function' && + typeof configuration.Promise.reject === 'function' + ) { + customPromise = configuration.Promise; ++ self.deprecated( ++ 'The `Promise` config property is deprecated. Future versions ' + ++ 'of Jasmine will create native promises even if the `Promise` ' + ++ 'config property is set. Please remove it.' ++ ); + } else { + throw new Error( + 'Custom promise library missing `resolve`/`reject` functions' + ); + } + } ++ ++ if (configuration.hasOwnProperty('verboseDeprecations')) { ++ config.verboseDeprecations = configuration.verboseDeprecations; ++ deprecator.verboseDeprecations(config.verboseDeprecations); ++ } + }; + + /** + * Get the current configuration for your jasmine environment + * @name Env#configuration + * @since 3.3.0 + * @function + * @returns {Configuration} + */ + this.configuration = function() { + var result = {}; + for (var property in config) { + result[property] = config[property]; + } + return result; + }; + + Object.defineProperty(this, 'specFilter', { + get: function() { + self.deprecated( - 'Getting specFilter directly from Env is deprecated and will be removed in a future version of Jasmine, please check the specFilter option from `configuration`' ++ 'Getting specFilter directly from Env is deprecated and will be ' + ++ 'removed in a future version of Jasmine. Please check the ' + ++ 'specFilter option from `configuration` instead.', ++ { ignoreRunnable: true } + ); + return config.specFilter; + }, + set: function(val) { + self.deprecated( - 'Setting specFilter directly on Env is deprecated and will be removed in a future version of Jasmine, please use the specFilter option in `configure`' ++ 'Setting specFilter directly on Env is deprecated and will be ' + ++ 'removed in a future version of Jasmine. Please use the ' + ++ 'specFilter option in `configure` instead.', ++ { ignoreRunnable: true } + ); + config.specFilter = val; + } + }); + + this.setDefaultSpyStrategy = function(defaultStrategyFn) { + if (!currentRunnable()) { + throw new Error( + 'Default spy strategy must be set in a before function or a spec' + ); + } + runnableResources[ + currentRunnable().id + ].defaultStrategyFn = defaultStrategyFn; + }; + + this.addSpyStrategy = function(name, fn) { + if (!currentRunnable()) { + throw new Error( + 'Custom spy strategies must be added in a before function or a spec' + ); + } + runnableResources[currentRunnable().id].customSpyStrategies[name] = fn; + }; + + this.addCustomEqualityTester = function(tester) { + if (!currentRunnable()) { + throw new Error( + 'Custom Equalities must be added in a before function or a spec' + ); + } + runnableResources[currentRunnable().id].customEqualityTesters.push( + tester + ); + }; + + this.addMatchers = function(matchersToAdd) { + if (!currentRunnable()) { + throw new Error( + 'Matchers must be added in a before function or a spec' + ); + } + var customMatchers = + runnableResources[currentRunnable().id].customMatchers; + + for (var matcherName in matchersToAdd) { ++ if (matchersToAdd[matcherName].length > 1) { ++ self.deprecated( ++ 'The matcher factory for "' + ++ matcherName + ++ '" ' + ++ 'accepts custom equality testers, but this parameter will no longer be ' + ++ 'passed in a future release. ' + ++ 'See for details.' ++ ); ++ } ++ + customMatchers[matcherName] = matchersToAdd[matcherName]; + } + }; + + this.addAsyncMatchers = function(matchersToAdd) { + if (!currentRunnable()) { + throw new Error( + 'Async Matchers must be added in a before function or a spec' + ); + } + var customAsyncMatchers = + runnableResources[currentRunnable().id].customAsyncMatchers; + + for (var matcherName in matchersToAdd) { ++ if (matchersToAdd[matcherName].length > 1) { ++ self.deprecated( ++ 'The matcher factory for "' + ++ matcherName + ++ '" ' + ++ 'accepts custom equality testers, but this parameter will no longer be ' + ++ 'passed in a future release. ' + ++ 'See for details.' ++ ); ++ } ++ + customAsyncMatchers[matcherName] = matchersToAdd[matcherName]; + } + }; + + this.addCustomObjectFormatter = function(formatter) { + if (!currentRunnable()) { + throw new Error( + 'Custom object formatters must be added in a before function or a spec' + ); + } + + runnableResources[currentRunnable().id].customObjectFormatters.push( + formatter + ); + }; + + j$.Expectation.addCoreMatchers(j$.matchers); + j$.Expectation.addAsyncCoreMatchers(j$.asyncMatchers); + + var nextSpecId = 0; + var getNextSpecId = function() { + return 'spec' + nextSpecId++; + }; + + var nextSuiteId = 0; + var getNextSuiteId = function() { + return 'suite' + nextSuiteId++; + }; + + var makePrettyPrinter = function() { + var customObjectFormatters = + runnableResources[currentRunnable().id].customObjectFormatters; + return j$.makePrettyPrinter(customObjectFormatters); + }; + + var makeMatchersUtil = function() { + var customEqualityTesters = + runnableResources[currentRunnable().id].customEqualityTesters; + return new j$.MatchersUtil({ + customTesters: customEqualityTesters, + pp: makePrettyPrinter() + }); + }; + + var expectationFactory = function(actual, spec) { + var customEqualityTesters = + runnableResources[spec.id].customEqualityTesters; + + return j$.Expectation.factory({ + matchersUtil: makeMatchersUtil(), + customEqualityTesters: customEqualityTesters, + customMatchers: runnableResources[spec.id].customMatchers, + actual: actual, + addExpectationResult: addExpectationResult + }); + + function addExpectationResult(passed, result) { + return spec.addExpectationResult(passed, result); + } + }; + + function recordLateExpectation(runable, runableType, result) { + var delayedExpectationResult = {}; + Object.keys(result).forEach(function(k) { + delayedExpectationResult[k] = result[k]; + }); + delayedExpectationResult.passed = false; + delayedExpectationResult.globalErrorType = 'lateExpectation'; + delayedExpectationResult.message = + runableType + + ' "' + + runable.getFullName() + + '" ran a "' + + result.matcherName + + '" expectation after it finished.\n'; + + if (result.message) { + delayedExpectationResult.message += + 'Message: "' + result.message + '"\n'; + } + + delayedExpectationResult.message += + '1. Did you forget to return or await the result of expectAsync?\n' + + '2. Was done() invoked before an async operation completed?\n' + + '3. Did an expectation follow a call to done()?'; + + topSuite.result.failedExpectations.push(delayedExpectationResult); + } + + var asyncExpectationFactory = function(actual, spec, runableType) { + return j$.Expectation.asyncFactory({ + matchersUtil: makeMatchersUtil(), + customEqualityTesters: runnableResources[spec.id].customEqualityTesters, + customAsyncMatchers: runnableResources[spec.id].customAsyncMatchers, + actual: actual, + addExpectationResult: addExpectationResult + }); + + function addExpectationResult(passed, result) { + if (currentRunnable() !== spec) { + recordLateExpectation(spec, runableType, result); + } + return spec.addExpectationResult(passed, result); + } + }; + var suiteAsyncExpectationFactory = function(actual, suite) { + return asyncExpectationFactory(actual, suite, 'Suite'); + }; + + var specAsyncExpectationFactory = function(actual, suite) { + return asyncExpectationFactory(actual, suite, 'Spec'); + }; + + var defaultResourcesForRunnable = function(id, parentRunnableId) { + var resources = { + spies: [], + customEqualityTesters: [], + customMatchers: {}, + customAsyncMatchers: {}, + customSpyStrategies: {}, + defaultStrategyFn: undefined, + customObjectFormatters: [] + }; + + if (runnableResources[parentRunnableId]) { + resources.customEqualityTesters = j$.util.clone( + runnableResources[parentRunnableId].customEqualityTesters + ); + resources.customMatchers = j$.util.clone( + runnableResources[parentRunnableId].customMatchers + ); + resources.customAsyncMatchers = j$.util.clone( + runnableResources[parentRunnableId].customAsyncMatchers + ); + resources.customObjectFormatters = j$.util.clone( + runnableResources[parentRunnableId].customObjectFormatters + ); + resources.defaultStrategyFn = + runnableResources[parentRunnableId].defaultStrategyFn; + } + + runnableResources[id] = resources; + }; + + var clearResourcesForRunnable = function(id) { + spyRegistry.clearSpies(); + delete runnableResources[id]; + }; + + var beforeAndAfterFns = function(targetSuite) { + return function() { + var befores = [], + afters = [], + suite = targetSuite; + + while (suite) { + befores = befores.concat(suite.beforeFns); + afters = afters.concat(suite.afterFns); + + suite = suite.parentSuite; + } + + return { + befores: befores.reverse(), + afters: afters + }; + }; + }; + + var getSpecName = function(spec, suite) { + var fullName = [spec.description], + suiteFullName = suite.getFullName(); + + if (suiteFullName !== '') { + fullName.unshift(suiteFullName); + } + return fullName.join(' '); + }; + + // TODO: we may just be able to pass in the fn instead of wrapping here + var buildExpectationResult = j$.buildExpectationResult, + exceptionFormatter = new j$.ExceptionFormatter(), + expectationResultFactory = function(attrs) { + attrs.messageFormatter = exceptionFormatter.message; + attrs.stackFormatter = exceptionFormatter.stack; + + return buildExpectationResult(attrs); + }; + + /** + * Sets whether Jasmine should throw an Error when an expectation fails. + * This causes a spec to only have one expectation failure. + * @name Env#throwOnExpectationFailure + * @since 2.3.0 + * @function + * @param {Boolean} value Whether to throw when a expectation fails + * @deprecated Use the `stopSpecOnExpectationFailure` option with {@link Env#configure} + */ + this.throwOnExpectationFailure = function(value) { + this.deprecated( + 'Setting throwOnExpectationFailure directly on Env is deprecated and ' + + 'will be removed in a future version of Jasmine. Please use the ' + - 'stopSpecOnExpectationFailure option in `configure`.' ++ 'stopSpecOnExpectationFailure option in `configure`.', ++ { ignoreRunnable: true } + ); + this.configure({ oneFailurePerSpec: !!value }); + }; + + this.throwingExpectationFailures = function() { + this.deprecated( + 'Getting throwingExpectationFailures directly from Env is deprecated ' + + 'and will be removed in a future version of Jasmine. Please check ' + - 'the stopSpecOnExpectationFailure option from `configuration`.' ++ 'the stopSpecOnExpectationFailure option from `configuration`.', ++ { ignoreRunnable: true } + ); + return config.oneFailurePerSpec; + }; + + /** + * Set whether to stop suite execution when a spec fails + * @name Env#stopOnSpecFailure + * @since 2.7.0 + * @function + * @param {Boolean} value Whether to stop suite execution when a spec fails + * @deprecated Use the `stopOnSpecFailure` option with {@link Env#configure} + */ + this.stopOnSpecFailure = function(value) { + this.deprecated( + 'Setting stopOnSpecFailure directly is deprecated and will be ' + + 'removed in a future version of Jasmine. Please use the ' + - 'stopOnSpecFailure option in `configure`.' ++ 'stopOnSpecFailure option in `configure`.', ++ { ignoreRunnable: true } + ); + this.configure({ stopOnSpecFailure: !!value }); + }; + + this.stoppingOnSpecFailure = function() { + this.deprecated( + 'Getting stoppingOnSpecFailure directly from Env is deprecated and ' + + 'will be removed in a future version of Jasmine. Please check the ' + - 'stopOnSpecFailure option from `configuration`.' ++ 'stopOnSpecFailure option from `configuration`.', ++ { ignoreRunnable: true } + ); + return config.failFast; + }; + + /** + * Set whether to randomize test execution order + * @name Env#randomizeTests + * @since 2.4.0 + * @function + * @param {Boolean} value Whether to randomize execution order + * @deprecated Use the `random` option with {@link Env#configure} + */ + this.randomizeTests = function(value) { + this.deprecated( - 'Setting randomizeTests directly is deprecated and will be removed in a future version of Jasmine, please use the random option in `configure`' ++ 'Setting randomizeTests directly is deprecated and will be removed ' + ++ 'in a future version of Jasmine. Please use the random option in ' + ++ '`configure` instead.', ++ { ignoreRunnable: true } + ); + config.random = !!value; + }; + + this.randomTests = function() { + this.deprecated( - 'Getting randomTests directly from Env is deprecated and will be removed in a future version of Jasmine, please check the random option from `configuration`' ++ 'Getting randomTests directly from Env is deprecated and will be ' + ++ 'removed in a future version of Jasmine. Please check the random ' + ++ 'option from `configuration` instead.', ++ { ignoreRunnable: true } + ); + return config.random; + }; + + /** + * Set the random number seed for spec randomization + * @name Env#seed + * @since 2.4.0 + * @function + * @param {Number} value The seed value + * @deprecated Use the `seed` option with {@link Env#configure} + */ + this.seed = function(value) { + this.deprecated( - 'Setting seed directly is deprecated and will be removed in a future version of Jasmine, please use the seed option in `configure`' ++ 'Setting seed directly is deprecated and will be removed in a ' + ++ 'future version of Jasmine. Please use the seed option in ' + ++ '`configure` instead.', ++ { ignoreRunnable: true } + ); + if (value) { + config.seed = value; + } + return config.seed; + }; + + this.hidingDisabled = function(value) { + this.deprecated( - 'Getting hidingDisabled directly from Env is deprecated and will be removed in a future version of Jasmine, please check the hideDisabled option from `configuration`' ++ 'Getting hidingDisabled directly from Env is deprecated and will ' + ++ 'be removed in a future version of Jasmine. Please check the ' + ++ 'hideDisabled option from `configuration` instead.', ++ { ignoreRunnable: true } + ); + return config.hideDisabled; + }; + + /** + * @name Env#hideDisabled + * @since 3.2.0 + * @function + * @deprecated Use the `hideDisabled` option with {@link Env#configure} + */ + this.hideDisabled = function(value) { + this.deprecated( - 'Setting hideDisabled directly is deprecated and will be removed in a future version of Jasmine, please use the hideDisabled option in `configure`' ++ 'Setting hideDisabled directly is deprecated and will be removed ' + ++ 'in a future version of Jasmine. Please use the hideDisabled option ' + ++ 'in `configure` instead.', ++ { ignoreRunnable: true } + ); + config.hideDisabled = !!value; + }; + - this.deprecated = function(deprecation) { ++ /** ++ * Causes a deprecation warning to be logged to the console and reported to ++ * reporters. ++ * ++ * The optional second parameter is an object that can have either of the ++ * following properties: ++ * ++ * omitStackTrace: Whether to omit the stack trace. Optional. Defaults to ++ * false. This option is ignored if the deprecation is an Error. Set this ++ * when the stack trace will not contain anything that helps the user find ++ * the source of the deprecation. ++ * ++ * ignoreRunnable: Whether to log the deprecation on the root suite, ignoring ++ * the spec or suite that's running when it happens. Optional. Defaults to ++ * false. ++ * ++ * @name Env#deprecated ++ * @since 2.99 ++ * @function ++ * @param {String|Error} deprecation The deprecation message ++ * @param {Object} [options] Optional extra options, as described above ++ */ ++ this.deprecated = function(deprecation, options) { + var runnable = currentRunnable() || topSuite; - var context; - - if (runnable === topSuite) { - context = ''; - } else if (runnable === currentSuite()) { - context = ' (in suite: ' + runnable.getFullName() + ')'; - } else { - context = ' (in spec: ' + runnable.getFullName() + ')'; - } - - runnable.addDeprecationWarning(deprecation); - if ( - typeof console !== 'undefined' && - typeof console.error === 'function' - ) { - console.error('DEPRECATION: ' + deprecation + context); - } ++ deprecator.addDeprecationWarning(runnable, deprecation, options); + }; + + var queueRunnerFactory = function(options, args) { + var failFast = false; + if (options.isLeaf) { + failFast = config.stopSpecOnExpectationFailure; + } else if (!options.isReporter) { + failFast = config.stopOnSpecFailure; + } + options.clearStack = options.clearStack || clearStack; + options.timeout = { + setTimeout: realSetTimeout, + clearTimeout: realClearTimeout + }; + options.fail = self.fail; + options.globalErrors = globalErrors; + options.completeOnFirstError = failFast; + options.onException = + options.onException || + function(e) { + (currentRunnable() || topSuite).onException(e); + }; + options.deprecated = self.deprecated; + + new j$.QueueRunner(options).execute(args); + }; + + var topSuite = new j$.Suite({ + env: this, + id: getNextSuiteId(), + description: 'Jasmine__TopLevel__Suite', + expectationFactory: expectationFactory, + asyncExpectationFactory: suiteAsyncExpectationFactory, + expectationResultFactory: expectationResultFactory, + autoCleanClosures: config.autoCleanClosures + }); ++ var deprecator = new j$.Deprecator(topSuite); + currentDeclarationSuite = topSuite; + + /** + * Provides the root suite, through which all suites and specs can be + * accessed. + * @function + * @name Env#topSuite + * @return {Suite} the root suite + * @since 2.0.0 + */ + this.topSuite = function() { - return topSuite; ++ return j$.deprecatingSuiteProxy(topSuite, null, this); + }; + + /** + * This represents the available reporter callback for an object passed to {@link Env#addReporter}. + * @interface Reporter + * @see custom_reporter + */ + var reporter = new j$.ReportDispatcher( + [ + /** + * `jasmineStarted` is called after all of the specs have been loaded, but just before execution starts. + * @function + * @name Reporter#jasmineStarted + * @param {JasmineStartedInfo} suiteInfo Information about the full Jasmine suite that is being run + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + * @see async + */ + 'jasmineStarted', + /** + * When the entire suite has finished execution `jasmineDone` is called + * @function + * @name Reporter#jasmineDone + * @param {JasmineDoneInfo} suiteInfo Information about the full Jasmine suite that just finished running. + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + * @see async + */ + 'jasmineDone', + /** + * `suiteStarted` is invoked when a `describe` starts to run + * @function + * @name Reporter#suiteStarted + * @param {SuiteResult} result Information about the individual {@link describe} being run + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + * @see async + */ + 'suiteStarted', + /** + * `suiteDone` is invoked when all of the child specs and suites for a given suite have been run + * + * While jasmine doesn't require any specific functions, not defining a `suiteDone` will make it impossible for a reporter to know when a suite has failures in an `afterAll`. + * @function + * @name Reporter#suiteDone + * @param {SuiteResult} result + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + * @see async + */ + 'suiteDone', + /** + * `specStarted` is invoked when an `it` starts to run (including associated `beforeEach` functions) + * @function + * @name Reporter#specStarted + * @param {SpecResult} result Information about the individual {@link it} being run + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + * @see async + */ + 'specStarted', + /** + * `specDone` is invoked when an `it` and its associated `beforeEach` and `afterEach` functions have been run. + * + * While jasmine doesn't require any specific functions, not defining a `specDone` will make it impossible for a reporter to know when a spec has failed. + * @function + * @name Reporter#specDone + * @param {SpecResult} result + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + * @see async + */ + 'specDone' + ], - queueRunnerFactory ++ queueRunnerFactory, ++ self.deprecated + ); + + /** + * Executes the specs. + * + * If called with no parameters or with a falsy value as the first parameter, + * all specs will be executed except those that are excluded by a + * [spec filter]{@link Configuration#specFilter} or other mechanism. If the + * first parameter is a list of spec/suite IDs, only those specs/suites will + * be run. + * + * Both parameters are optional, but a completion callback is only valid as + * the second parameter. To specify a completion callback but not a list of + * specs/suites to run, pass null or undefined as the first parameter. + * + * execute should not be called more than once. + * + * If the environment supports promises, execute will return a promise that + * is resolved after the suite finishes executing. The promise will be + * resolved (not rejected) as long as the suite runs to completion. Use a + * {@link Reporter} to determine whether or not the suite passed. + * + * @name Env#execute + * @since 2.0.0 + * @function + * @param {(string[])=} runnablesToRun IDs of suites and/or specs to run + * @param {Function=} onComplete Function that will be called after all specs have run + * @return {Promise} + */ + this.execute = function(runnablesToRun, onComplete) { + if (this._executedBefore) { + topSuite.reset(); + } + this._executedBefore = true; + defaultResourcesForRunnable(topSuite.id); + installGlobalErrors(); + + if (!runnablesToRun) { + if (focusedRunnables.length) { + runnablesToRun = focusedRunnables; + } else { + runnablesToRun = [topSuite.id]; + } + } + + var order = new j$.Order({ + random: config.random, + seed: config.seed + }); + + var processor = new j$.TreeProcessor({ + tree: topSuite, + runnableIds: runnablesToRun, + queueRunnerFactory: queueRunnerFactory, + failSpecWithNoExpectations: config.failSpecWithNoExpectations, + nodeStart: function(suite, next) { + currentlyExecutingSuites.push(suite); + defaultResourcesForRunnable(suite.id, suite.parentSuite.id); + reporter.suiteStarted(suite.result, next); + suite.startTimer(); + }, + nodeComplete: function(suite, result, next) { + if (suite !== currentSuite()) { + throw new Error('Tried to complete the wrong suite'); + } + + clearResourcesForRunnable(suite.id); + currentlyExecutingSuites.pop(); + + if (result.status === 'failed') { + hasFailures = true; + } + suite.endTimer(); + reporter.suiteDone(result, next); + }, + orderChildren: function(node) { + return order.sort(node.children); + }, + excludeNode: function(spec) { + return !config.specFilter(spec); + } + }); + + if (!processor.processTree().valid) { + throw new Error( + 'Invalid order: would cause a beforeAll or afterAll to be run multiple times' + ); + } + + var jasmineTimer = new j$.Timer(); + jasmineTimer.start(); + + var Promise = customPromise || global.Promise; + + if (Promise) { + return new Promise(function(resolve) { + runAll(function() { + if (onComplete) { + onComplete(); + } + + resolve(); + }); + }); + } else { + runAll(function() { + if (onComplete) { + onComplete(); + } + }); + } + + function runAll(done) { + /** + * Information passed to the {@link Reporter#jasmineStarted} event. + * @typedef JasmineStartedInfo + * @property {Int} totalSpecsDefined - The total number of specs defined in this suite. + * @property {Order} order - Information about the ordering (random or not) of this execution of the suite. + * @since 2.0.0 + */ + reporter.jasmineStarted( + { + totalSpecsDefined: totalSpecsDefined, + order: order + }, + function() { + currentlyExecutingSuites.push(topSuite); + + processor.execute(function() { + clearResourcesForRunnable(topSuite.id); + currentlyExecutingSuites.pop(); + var overallStatus, incompleteReason; + + if ( + hasFailures || + topSuite.result.failedExpectations.length > 0 + ) { + overallStatus = 'failed'; + } else if (focusedRunnables.length > 0) { + overallStatus = 'incomplete'; + incompleteReason = 'fit() or fdescribe() was found'; + } else if (totalSpecsDefined === 0) { + overallStatus = 'incomplete'; + incompleteReason = 'No specs found'; + } else { + overallStatus = 'passed'; + } + + /** + * Information passed to the {@link Reporter#jasmineDone} event. + * @typedef JasmineDoneInfo + * @property {OverallStatus} overallStatus - The overall result of the suite: 'passed', 'failed', or 'incomplete'. + * @property {Int} totalTime - The total time (in ms) that it took to execute the suite + * @property {IncompleteReason} incompleteReason - Explanation of why the suite was incomplete. + * @property {Order} order - Information about the ordering (random or not) of this execution of the suite. + * @property {Expectation[]} failedExpectations - List of expectations that failed in an {@link afterAll} at the global level. + * @property {Expectation[]} deprecationWarnings - List of deprecation warnings that occurred at the global level. + * @since 2.4.0 + */ + reporter.jasmineDone( + { + overallStatus: overallStatus, + totalTime: jasmineTimer.elapsed(), + incompleteReason: incompleteReason, + order: order, + failedExpectations: topSuite.result.failedExpectations, + deprecationWarnings: topSuite.result.deprecationWarnings + }, + done + ); + }); + } + ); + } + }; + + /** + * Add a custom reporter to the Jasmine environment. + * @name Env#addReporter + * @since 2.0.0 + * @function + * @param {Reporter} reporterToAdd The reporter to be added. + * @see custom_reporter + */ + this.addReporter = function(reporterToAdd) { + reporter.addReporter(reporterToAdd); + }; + + /** + * Provide a fallback reporter if no other reporters have been specified. + * @name Env#provideFallbackReporter + * @since 2.5.0 + * @function + * @param {Reporter} reporterToAdd The reporter + * @see custom_reporter + */ + this.provideFallbackReporter = function(reporterToAdd) { + reporter.provideFallbackReporter(reporterToAdd); + }; + + /** + * Clear all registered reporters + * @name Env#clearReporters + * @since 2.5.2 + * @function + */ + this.clearReporters = function() { + reporter.clearReporters(); + }; + + var spyFactory = new j$.SpyFactory( + function getCustomStrategies() { + var runnable = currentRunnable(); + + if (runnable) { + return runnableResources[runnable.id].customSpyStrategies; + } + + return {}; + }, + function getDefaultStrategyFn() { + var runnable = currentRunnable(); + + if (runnable) { + return runnableResources[runnable.id].defaultStrategyFn; + } + + return undefined; + }, + function getPromise() { + return customPromise || global.Promise; + } + ); + + var spyRegistry = new j$.SpyRegistry({ + currentSpies: function() { + if (!currentRunnable()) { + throw new Error( + 'Spies must be created in a before function or a spec' + ); + } + return runnableResources[currentRunnable().id].spies; + }, + createSpy: function(name, originalFn) { + return self.createSpy(name, originalFn); + } + }); + + /** + * Configures whether Jasmine should allow the same function to be spied on + * more than once during the execution of a spec. By default, spying on + * a function that is already a spy will cause an error. + * @name Env#allowRespy + * @function + * @since 2.5.0 + * @param {boolean} allow Whether to allow respying + */ + this.allowRespy = function(allow) { + spyRegistry.allowRespy(allow); + }; + + this.spyOn = function() { + return spyRegistry.spyOn.apply(spyRegistry, arguments); + }; + + this.spyOnProperty = function() { + return spyRegistry.spyOnProperty.apply(spyRegistry, arguments); + }; + + this.spyOnAllFunctions = function() { + return spyRegistry.spyOnAllFunctions.apply(spyRegistry, arguments); + }; + + this.createSpy = function(name, originalFn) { + if (arguments.length === 1 && j$.isFunction_(name)) { + originalFn = name; + name = originalFn.name; + } + + return spyFactory.createSpy(name, originalFn); + }; + + this.createSpyObj = function(baseName, methodNames, propertyNames) { + return spyFactory.createSpyObj(baseName, methodNames, propertyNames); + }; + + var ensureIsFunction = function(fn, caller) { + if (!j$.isFunction_(fn)) { + throw new Error( + caller + ' expects a function argument; received ' + j$.getType_(fn) + ); + } + }; + + var ensureIsFunctionOrAsync = function(fn, caller) { + if (!j$.isFunction_(fn) && !j$.isAsyncFunction_(fn)) { + throw new Error( + caller + ' expects a function argument; received ' + j$.getType_(fn) + ); + } + }; + + function ensureIsNotNested(method) { + var runnable = currentRunnable(); + if (runnable !== null && runnable !== undefined) { + throw new Error( + "'" + method + "' should only be used in 'describe' function" + ); + } + } + + var suiteFactory = function(description) { + var suite = new j$.Suite({ + env: self, + id: getNextSuiteId(), + description: description, + parentSuite: currentDeclarationSuite, + timer: new j$.Timer(), + expectationFactory: expectationFactory, + asyncExpectationFactory: suiteAsyncExpectationFactory, + expectationResultFactory: expectationResultFactory, + throwOnExpectationFailure: config.oneFailurePerSpec, + autoCleanClosures: config.autoCleanClosures + }); + + return suite; + }; + + this.describe = function(description, specDefinitions) { - //ensureIsNotNested('describe'); ++ ensureIsNotNested('describe'); + ensureIsFunction(specDefinitions, 'describe'); + var suite = suiteFactory(description); + if (specDefinitions.length > 0) { + throw new Error('describe does not expect any arguments'); + } + if (currentDeclarationSuite.markedExcluding) { + suite.exclude(); + } + addSpecsToSuite(suite, specDefinitions); - return suite; ++ if (suite.parentSuite && !suite.children.length) { ++ this.deprecated( ++ 'describe with no children (describe() or it()) is ' + ++ 'deprecated and will be removed in a future version of Jasmine. ' + ++ 'Please either remove the describe or add children to it.' ++ ); ++ } ++ return j$.deprecatingSuiteProxy(suite, suite.parentSuite, this); + }; + + this.xdescribe = function(description, specDefinitions) { + ensureIsNotNested('xdescribe'); + ensureIsFunction(specDefinitions, 'xdescribe'); + var suite = suiteFactory(description); + suite.exclude(); + addSpecsToSuite(suite, specDefinitions); - return suite; ++ return j$.deprecatingSuiteProxy(suite, suite.parentSuite, this); + }; + + var focusedRunnables = []; + + this.fdescribe = function(description, specDefinitions) { + ensureIsNotNested('fdescribe'); + ensureIsFunction(specDefinitions, 'fdescribe'); + var suite = suiteFactory(description); + suite.isFocused = true; + + focusedRunnables.push(suite.id); + unfocusAncestor(); + addSpecsToSuite(suite, specDefinitions); + - return suite; ++ return j$.deprecatingSuiteProxy(suite, suite.parentSuite, this); + }; + + function addSpecsToSuite(suite, specDefinitions) { + var parentSuite = currentDeclarationSuite; + parentSuite.addChild(suite); + currentDeclarationSuite = suite; + + var declarationError = null; + try { - specDefinitions.call(suite); ++ specDefinitions.call(j$.deprecatingThisProxy(suite, self)); + } catch (e) { + declarationError = e; + } + + if (declarationError) { + suite.onException(declarationError); + } + + currentDeclarationSuite = parentSuite; + } + + function findFocusedAncestor(suite) { + while (suite) { + if (suite.isFocused) { + return suite.id; + } + suite = suite.parentSuite; + } + + return null; + } + + function unfocusAncestor() { + var focusedAncestor = findFocusedAncestor(currentDeclarationSuite); + if (focusedAncestor) { + for (var i = 0; i < focusedRunnables.length; i++) { + if (focusedRunnables[i] === focusedAncestor) { + focusedRunnables.splice(i, 1); + break; + } + } + } + } + + var specFactory = function(description, fn, suite, timeout) { + totalSpecsDefined++; + var spec = new j$.Spec({ + id: getNextSpecId(), + beforeAndAfterFns: beforeAndAfterFns(suite), + expectationFactory: expectationFactory, + asyncExpectationFactory: specAsyncExpectationFactory, ++ deprecated: self.deprecated, + resultCallback: specResultCallback, + getSpecName: function(spec) { + return getSpecName(spec, suite); + }, + onStart: specStarted, + description: description, + expectationResultFactory: expectationResultFactory, + queueRunnerFactory: queueRunnerFactory, + userContext: function() { + return suite.clonedSharedUserContext(); + }, + queueableFn: { + fn: fn, + timeout: timeout || 0 + }, + throwOnExpectationFailure: config.oneFailurePerSpec, + autoCleanClosures: config.autoCleanClosures, + timer: new j$.Timer() + }); + return spec; + + function specResultCallback(result, next) { + clearResourcesForRunnable(spec.id); + currentSpec = null; + + if (result.status === 'failed') { + hasFailures = true; + } + + reporter.specDone(result, next); + } + + function specStarted(spec, next) { + currentSpec = spec; + defaultResourcesForRunnable(spec.id, suite.id); + reporter.specStarted(spec.result, next); + } + }; + - this.it = function(description, fn, timeout) { ++ this.it_ = function(description, fn, timeout) { + ensureIsNotNested('it'); + // it() sometimes doesn't have a fn argument, so only check the type if + // it's given. + if (arguments.length > 1 && typeof fn !== 'undefined') { + ensureIsFunctionOrAsync(fn, 'it'); + } + + if (timeout) { + j$.util.validateTimeout(timeout); + } + + var spec = specFactory(description, fn, currentDeclarationSuite, timeout); + if (currentDeclarationSuite.markedExcluding) { + spec.exclude(); + } + currentDeclarationSuite.addChild(spec); ++ + return spec; + }; + ++ this.it = function(description, fn, timeout) { ++ var spec = this.it_(description, fn, timeout); ++ return j$.deprecatingSpecProxy(spec, this); ++ }; ++ + this.xit = function(description, fn, timeout) { + ensureIsNotNested('xit'); + // xit(), like it(), doesn't always have a fn argument, so only check the + // type when needed. + if (arguments.length > 1 && typeof fn !== 'undefined') { + ensureIsFunctionOrAsync(fn, 'xit'); + } - var spec = this.it.apply(this, arguments); ++ var spec = this.it_.apply(this, arguments); + spec.exclude('Temporarily disabled with xit'); - return spec; ++ return j$.deprecatingSpecProxy(spec, this); + }; + + this.fit = function(description, fn, timeout) { + ensureIsNotNested('fit'); + ensureIsFunctionOrAsync(fn, 'fit'); + + if (timeout) { + j$.util.validateTimeout(timeout); + } + var spec = specFactory(description, fn, currentDeclarationSuite, timeout); + currentDeclarationSuite.addChild(spec); + focusedRunnables.push(spec.id); + unfocusAncestor(); - return spec; ++ return j$.deprecatingSpecProxy(spec, this); + }; + + /** + * Sets a user-defined property that will be provided to reporters as part of the properties field of {@link SpecResult} + * @name Env#setSpecProperty + * @since 3.6.0 + * @function + * @param {String} key The name of the property + * @param {*} value The value of the property + */ + this.setSpecProperty = function(key, value) { + if (!currentRunnable() || currentRunnable() == currentSuite()) { + throw new Error( + "'setSpecProperty' was used when there was no current spec" + ); + } + currentRunnable().setSpecProperty(key, value); + }; + + /** + * Sets a user-defined property that will be provided to reporters as part of the properties field of {@link SuiteResult} + * @name Env#setSuiteProperty + * @since 3.6.0 + * @function + * @param {String} key The name of the property + * @param {*} value The value of the property + */ + this.setSuiteProperty = function(key, value) { + if (!currentSuite()) { + throw new Error( + "'setSuiteProperty' was used when there was no current suite" + ); + } + currentSuite().setSuiteProperty(key, value); + }; + + this.expect = function(actual) { + if (!currentRunnable()) { + throw new Error( + "'expect' was used when there was no current spec, this could be because an asynchronous test timed out" + ); + } + + return currentRunnable().expect(actual); + }; + + this.expectAsync = function(actual) { + if (!currentRunnable()) { + throw new Error( + "'expectAsync' was used when there was no current spec, this could be because an asynchronous test timed out" + ); + } + + return currentRunnable().expectAsync(actual); + }; + + this.beforeEach = function(beforeEachFunction, timeout) { + ensureIsNotNested('beforeEach'); + ensureIsFunctionOrAsync(beforeEachFunction, 'beforeEach'); + + if (timeout) { + j$.util.validateTimeout(timeout); + } + + currentDeclarationSuite.beforeEach({ + fn: beforeEachFunction, + timeout: timeout || 0 + }); + }; + + this.beforeAll = function(beforeAllFunction, timeout) { + ensureIsNotNested('beforeAll'); + ensureIsFunctionOrAsync(beforeAllFunction, 'beforeAll'); + + if (timeout) { + j$.util.validateTimeout(timeout); + } + + currentDeclarationSuite.beforeAll({ + fn: beforeAllFunction, + timeout: timeout || 0 + }); + }; + + this.afterEach = function(afterEachFunction, timeout) { + ensureIsNotNested('afterEach'); + ensureIsFunctionOrAsync(afterEachFunction, 'afterEach'); + + if (timeout) { + j$.util.validateTimeout(timeout); + } + + afterEachFunction.isCleanup = true; + currentDeclarationSuite.afterEach({ + fn: afterEachFunction, + timeout: timeout || 0 + }); + }; + + this.afterAll = function(afterAllFunction, timeout) { + ensureIsNotNested('afterAll'); + ensureIsFunctionOrAsync(afterAllFunction, 'afterAll'); + + if (timeout) { + j$.util.validateTimeout(timeout); + } + + currentDeclarationSuite.afterAll({ + fn: afterAllFunction, + timeout: timeout || 0 + }); + }; + + this.pending = function(message) { + var fullMessage = j$.Spec.pendingSpecExceptionMessage; + if (message) { + fullMessage += message; + } + throw fullMessage; + }; + + this.fail = function(error) { + if (!currentRunnable()) { + throw new Error( + "'fail' was used when there was no current spec, this could be because an asynchronous test timed out" + ); + } + + var message = 'Failed'; + if (error) { + message += ': '; + if (error.message) { + message += error.message; + } else if (j$.isString_(error)) { + message += error; + } else { + // pretty print all kind of objects. This includes arrays. + message += makePrettyPrinter()(error); + } + } + + currentRunnable().addExpectationResult(false, { + matcherName: '', + passed: false, + expected: '', + actual: '', + message: message, + error: error && error.message ? error : null + }); + + if (config.oneFailurePerSpec) { + throw new Error(message); + } + }; + + this.cleanup_ = function() { + if (globalErrors) { + globalErrors.uninstall(); + } + }; + } + + return Env; +}; + +getJasmineRequireObj().JsApiReporter = function(j$) { + /** + * @name jsApiReporter + * @classdesc {@link Reporter} added by default in `boot.js` to record results for retrieval in javascript code. An instance is made available as `jsApiReporter` on the global object. + * @class + * @hideconstructor + */ + function JsApiReporter(options) { + var timer = options.timer || new j$.Timer(), + status = 'loaded'; + + this.started = false; + this.finished = false; + this.runDetails = {}; + + this.jasmineStarted = function() { + this.started = true; + status = 'started'; + timer.start(); + }; + + var executionTime; + + this.jasmineDone = function(runDetails) { + this.finished = true; + this.runDetails = runDetails; + executionTime = timer.elapsed(); + status = 'done'; + }; + + /** + * Get the current status for the Jasmine environment. + * @name jsApiReporter#status + * @since 2.0.0 + * @function + * @return {String} - One of `loaded`, `started`, or `done` + */ + this.status = function() { + return status; + }; + + var suites = [], + suites_hash = {}; + + this.suiteStarted = function(result) { + suites_hash[result.id] = result; + }; + + this.suiteDone = function(result) { + storeSuite(result); + }; + + /** + * Get the results for a set of suites. + * + * Retrievable in slices for easier serialization. + * @name jsApiReporter#suiteResults + * @since 2.1.0 + * @function + * @param {Number} index - The position in the suites list to start from. + * @param {Number} length - Maximum number of suite results to return. + * @return {SuiteResult[]} + */ + this.suiteResults = function(index, length) { + return suites.slice(index, index + length); + }; + + function storeSuite(result) { + suites.push(result); + suites_hash[result.id] = result; + } + + /** + * Get all of the suites in a single object, with their `id` as the key. + * @name jsApiReporter#suites + * @since 2.0.0 + * @function + * @return {Object} - Map of suite id to {@link SuiteResult} + */ + this.suites = function() { + return suites_hash; + }; + + var specs = []; + + this.specDone = function(result) { + specs.push(result); + }; + + /** + * Get the results for a set of specs. + * + * Retrievable in slices for easier serialization. + * @name jsApiReporter#specResults + * @since 2.0.0 + * @function + * @param {Number} index - The position in the specs list to start from. + * @param {Number} length - Maximum number of specs results to return. + * @return {SpecResult[]} + */ + this.specResults = function(index, length) { + return specs.slice(index, index + length); + }; + + /** + * Get all spec results. + * @name jsApiReporter#specs + * @since 2.0.0 + * @function + * @return {SpecResult[]} + */ + this.specs = function() { + return specs; + }; + + /** + * Get the number of milliseconds it took for the full Jasmine suite to run. + * @name jsApiReporter#executionTime + * @since 2.0.0 + * @function + * @return {Number} + */ + this.executionTime = function() { + return executionTime; + }; + } + + return JsApiReporter; +}; + +getJasmineRequireObj().Any = function(j$) { + function Any(expectedObject) { + if (typeof expectedObject === 'undefined') { + throw new TypeError( + 'jasmine.any() expects to be passed a constructor function. ' + + 'Please pass one or use jasmine.anything() to match any object.' + ); + } + this.expectedObject = expectedObject; + } + + Any.prototype.asymmetricMatch = function(other) { + if (this.expectedObject == String) { + return typeof other == 'string' || other instanceof String; + } + + if (this.expectedObject == Number) { + return typeof other == 'number' || other instanceof Number; + } + + if (this.expectedObject == Function) { + return typeof other == 'function' || other instanceof Function; + } + + if (this.expectedObject == Object) { + return other !== null && typeof other == 'object'; + } + + if (this.expectedObject == Boolean) { + return typeof other == 'boolean'; + } + + /* jshint -W122 */ + /* global Symbol */ + if (typeof Symbol != 'undefined' && this.expectedObject == Symbol) { + return typeof other == 'symbol'; + } + /* jshint +W122 */ + + return other instanceof this.expectedObject; + }; + + Any.prototype.jasmineToString = function() { + return ''; + }; + + return Any; +}; + +getJasmineRequireObj().Anything = function(j$) { + function Anything() {} + + Anything.prototype.asymmetricMatch = function(other) { + return !j$.util.isUndefined(other) && other !== null; + }; + + Anything.prototype.jasmineToString = function() { + return ''; + }; + + return Anything; +}; + +getJasmineRequireObj().ArrayContaining = function(j$) { + function ArrayContaining(sample) { + this.sample = sample; + } + + ArrayContaining.prototype.asymmetricMatch = function(other, matchersUtil) { + if (!j$.isArray_(this.sample)) { + throw new Error( + 'You must provide an array to arrayContaining, not ' + - j$.pp(this.sample) + ++ j$.basicPrettyPrinter_(this.sample) + + '.' + ); + } + + // If the actual parameter is not an array, we can fail immediately, since it couldn't + // possibly be an "array containing" anything. However, we also want an empty sample + // array to match anything, so we need to double-check we aren't in that case + if (!j$.isArray_(other) && this.sample.length > 0) { + return false; + } + + for (var i = 0; i < this.sample.length; i++) { + var item = this.sample[i]; + if (!matchersUtil.contains(other, item)) { + return false; + } + } + + return true; + }; + + ArrayContaining.prototype.jasmineToString = function(pp) { + return ''; + }; + + return ArrayContaining; +}; + +getJasmineRequireObj().ArrayWithExactContents = function(j$) { + function ArrayWithExactContents(sample) { + this.sample = sample; + } + + ArrayWithExactContents.prototype.asymmetricMatch = function( + other, + matchersUtil + ) { + if (!j$.isArray_(this.sample)) { + throw new Error( + 'You must provide an array to arrayWithExactContents, not ' + - j$.pp(this.sample) + ++ j$.basicPrettyPrinter_(this.sample) + + '.' + ); + } + + if (this.sample.length !== other.length) { + return false; + } + + for (var i = 0; i < this.sample.length; i++) { + var item = this.sample[i]; + if (!matchersUtil.contains(other, item)) { + return false; + } + } + + return true; + }; + + ArrayWithExactContents.prototype.jasmineToString = function(pp) { + return ''; + }; + + return ArrayWithExactContents; +}; + +getJasmineRequireObj().Empty = function(j$) { + function Empty() {} + + Empty.prototype.asymmetricMatch = function(other) { + if (j$.isString_(other) || j$.isArray_(other) || j$.isTypedArray_(other)) { + return other.length === 0; + } + + if (j$.isMap(other) || j$.isSet(other)) { + return other.size === 0; + } + + if (j$.isObject_(other)) { + return Object.keys(other).length === 0; + } + return false; + }; + + Empty.prototype.jasmineToString = function() { + return ''; + }; + + return Empty; +}; + +getJasmineRequireObj().Falsy = function(j$) { + function Falsy() {} + + Falsy.prototype.asymmetricMatch = function(other) { + return !other; + }; + + Falsy.prototype.jasmineToString = function() { + return ''; + }; + + return Falsy; +}; + +getJasmineRequireObj().MapContaining = function(j$) { + function MapContaining(sample) { + if (!j$.isMap(sample)) { + throw new Error( - 'You must provide a map to `mapContaining`, not ' + j$.pp(sample) ++ 'You must provide a map to `mapContaining`, not ' + ++ j$.basicPrettyPrinter_(sample) + ); + } + + this.sample = sample; + } + + MapContaining.prototype.asymmetricMatch = function(other, matchersUtil) { + if (!j$.isMap(other)) return false; + + var hasAllMatches = true; + j$.util.forEachBreakable(this.sample, function(breakLoop, value, key) { + // for each key/value pair in `sample` + // there should be at least one pair in `other` whose key and value both match + var hasMatch = false; + j$.util.forEachBreakable(other, function(oBreakLoop, oValue, oKey) { + if ( + matchersUtil.equals(oKey, key) && + matchersUtil.equals(oValue, value) + ) { + hasMatch = true; + oBreakLoop(); + } + }); + if (!hasMatch) { + hasAllMatches = false; + breakLoop(); + } + }); + + return hasAllMatches; + }; + + MapContaining.prototype.jasmineToString = function(pp) { + return ''; + }; + + return MapContaining; +}; + +getJasmineRequireObj().NotEmpty = function(j$) { + function NotEmpty() {} + + NotEmpty.prototype.asymmetricMatch = function(other) { + if (j$.isString_(other) || j$.isArray_(other) || j$.isTypedArray_(other)) { + return other.length !== 0; + } + + if (j$.isMap(other) || j$.isSet(other)) { + return other.size !== 0; + } + + if (j$.isObject_(other)) { + return Object.keys(other).length !== 0; + } + + return false; + }; + + NotEmpty.prototype.jasmineToString = function() { + return ''; + }; + + return NotEmpty; +}; + +getJasmineRequireObj().ObjectContaining = function(j$) { + function ObjectContaining(sample) { + this.sample = sample; + } + + function getPrototype(obj) { + if (Object.getPrototypeOf) { + return Object.getPrototypeOf(obj); + } + + if (obj.constructor.prototype == obj) { + return null; + } + + return obj.constructor.prototype; + } + + function hasProperty(obj, property) { + if (!obj || typeof obj !== 'object') { + return false; + } + + if (Object.prototype.hasOwnProperty.call(obj, property)) { + return true; + } + + return hasProperty(getPrototype(obj), property); + } + + ObjectContaining.prototype.asymmetricMatch = function(other, matchersUtil) { + if (typeof this.sample !== 'object') { + throw new Error( + "You must provide an object to objectContaining, not '" + + this.sample + + "'." + ); + } + if (typeof other !== 'object') { + return false; + } + + for (var property in this.sample) { + if ( + !hasProperty(other, property) || + !matchersUtil.equals(this.sample[property], other[property]) + ) { + return false; + } + } + + return true; + }; + + ObjectContaining.prototype.valuesForDiff_ = function(other, pp) { + if (!j$.isObject_(other)) { + return { + self: this.jasmineToString(pp), + other: other + }; + } + + var filteredOther = {}; + Object.keys(this.sample).forEach(function(k) { + // eq short-circuits comparison of objects that have different key sets, + // so include all keys even if undefined. + filteredOther[k] = other[k]; + }); + + return { + self: this.sample, + other: filteredOther + }; + }; + + ObjectContaining.prototype.jasmineToString = function(pp) { + return ''; + }; + + return ObjectContaining; +}; + +getJasmineRequireObj().SetContaining = function(j$) { + function SetContaining(sample) { + if (!j$.isSet(sample)) { + throw new Error( - 'You must provide a set to `setContaining`, not ' + j$.pp(sample) ++ 'You must provide a set to `setContaining`, not ' + ++ j$.basicPrettyPrinter_(sample) + ); + } + + this.sample = sample; + } + + SetContaining.prototype.asymmetricMatch = function(other, matchersUtil) { + if (!j$.isSet(other)) return false; + + var hasAllMatches = true; + j$.util.forEachBreakable(this.sample, function(breakLoop, item) { + // for each item in `sample` there should be at least one matching item in `other` + // (not using `matchersUtil.contains` because it compares set members by reference, + // not by deep value equality) + var hasMatch = false; + j$.util.forEachBreakable(other, function(oBreakLoop, oItem) { + if (matchersUtil.equals(oItem, item)) { + hasMatch = true; + oBreakLoop(); + } + }); + if (!hasMatch) { + hasAllMatches = false; + breakLoop(); + } + }); + + return hasAllMatches; + }; + + SetContaining.prototype.jasmineToString = function(pp) { + return ''; + }; + + return SetContaining; +}; + +getJasmineRequireObj().StringContaining = function(j$) { + function StringContaining(expected) { + if (!j$.isString_(expected)) { + throw new Error('Expected is not a String'); + } + + this.expected = expected; + } + + StringContaining.prototype.asymmetricMatch = function(other) { + if (!j$.isString_(other)) { + // Arrays, etc. don't match no matter what their indexOf returns. + return false; + } + + return other.indexOf(this.expected) !== -1; + }; + + StringContaining.prototype.jasmineToString = function() { + return ''; + }; + + return StringContaining; +}; + +getJasmineRequireObj().StringMatching = function(j$) { + function StringMatching(expected) { + if (!j$.isString_(expected) && !j$.isA_('RegExp', expected)) { + throw new Error('Expected is not a String or a RegExp'); + } + + this.regexp = new RegExp(expected); + } + + StringMatching.prototype.asymmetricMatch = function(other) { + return this.regexp.test(other); + }; + + StringMatching.prototype.jasmineToString = function() { + return ''; + }; + + return StringMatching; +}; + +getJasmineRequireObj().Truthy = function(j$) { + function Truthy() {} + + Truthy.prototype.asymmetricMatch = function(other) { + return !!other; + }; + + Truthy.prototype.jasmineToString = function() { + return ''; + }; + + return Truthy; +}; + +getJasmineRequireObj().asymmetricEqualityTesterArgCompatShim = function(j$) { + /* + Older versions of Jasmine passed an array of custom equality testers as the + second argument to each asymmetric equality tester's `asymmetricMatch` + method. Newer versions will pass a `MatchersUtil` instance. The + asymmetricEqualityTesterArgCompatShim allows for a graceful migration from + the old interface to the new by "being" both an array of custom equality + testers and a `MatchersUtil` at the same time. + + This code should be removed in the next major release. + */ + + var likelyArrayProps = [ + 'concat', + 'constructor', + 'copyWithin', + 'entries', + 'every', + 'fill', + 'filter', + 'find', + 'findIndex', + 'flat', + 'flatMap', + 'forEach', + 'includes', + 'indexOf', + 'join', + 'keys', + 'lastIndexOf', + 'length', + 'map', + 'pop', + 'push', + 'reduce', + 'reduceRight', + 'reverse', + 'shift', + 'slice', + 'some', + 'sort', + 'splice', + 'toLocaleString', + 'toSource', + 'toString', + 'unshift', + 'values' + ]; + + function asymmetricEqualityTesterArgCompatShim( + matchersUtil, + customEqualityTesters + ) { - var self = Object.create(matchersUtil), - props, - i, - k; ++ var self = Object.create(matchersUtil); + - copy(self, customEqualityTesters, 'length'); ++ copyAndDeprecate(self, customEqualityTesters, 'length'); + + for (i = 0; i < customEqualityTesters.length; i++) { - copy(self, customEqualityTesters, i); ++ copyAndDeprecate(self, customEqualityTesters, i); + } + - var props = arrayProps(); ++ // Avoid copying array props if we've previously done so, ++ // to avoid triggering our own deprecation warnings. ++ if (!self.isAsymmetricEqualityTesterArgCompatShim_) { ++ copyAndDeprecateArrayMethods(self); ++ } ++ ++ self.isAsymmetricEqualityTesterArgCompatShim_ = true; ++ return self; ++ } ++ ++ function copyAndDeprecateArrayMethods(dest) { ++ var props = arrayProps(), ++ i, ++ k; + + for (i = 0; i < props.length; i++) { + k = props[i]; ++ + // Skip length (dealt with above), and anything that collides with + // MatchesUtil e.g. an Array.prototype.contains method added by user code - if (k !== 'length' && !self[k]) { - copy(self, Array.prototype, k); ++ if (k !== 'length' && !dest[k]) { ++ copyAndDeprecate(dest, Array.prototype, k); + } + } - - return self; + } + - function copy(dest, src, propName) { ++ function copyAndDeprecate(dest, src, propName) { + Object.defineProperty(dest, propName, { + get: function() { ++ j$.getEnv().deprecated( ++ 'The second argument to asymmetricMatch is now a ' + ++ 'MatchersUtil. Using it as an array of custom equality testers is ' + ++ 'deprecated and will stop working in a future release. ' + ++ 'See for details.' ++ ); + return src[propName]; + } + }); + } + + function arrayProps() { + var props, a, k; + + if (!Object.getOwnPropertyDescriptors) { + return likelyArrayProps.filter(function(k) { + return Array.prototype.hasOwnProperty(k); + }); + } + + props = Object.getOwnPropertyDescriptors(Array.prototype); // eslint-disable-line compat/compat + a = []; + + for (k in props) { + a.push(k); + } + + return a; + } + + return asymmetricEqualityTesterArgCompatShim; +}; + +getJasmineRequireObj().CallTracker = function(j$) { + /** + * @namespace Spy#calls + * @since 2.0.0 + */ + function CallTracker() { + var calls = []; + var opts = {}; + + this.track = function(context) { + if (opts.cloneArgs) { + context.args = j$.util.cloneArgs(context.args); + } + calls.push(context); + }; + + /** + * Check whether this spy has been invoked. + * @name Spy#calls#any + * @since 2.0.0 + * @function + * @return {Boolean} + */ + this.any = function() { + return !!calls.length; + }; + + /** + * Get the number of invocations of this spy. + * @name Spy#calls#count + * @since 2.0.0 + * @function + * @return {Integer} + */ + this.count = function() { + return calls.length; + }; + + /** + * Get the arguments that were passed to a specific invocation of this spy. + * @name Spy#calls#argsFor + * @since 2.0.0 + * @function + * @param {Integer} index The 0-based invocation index. + * @return {Array} + */ + this.argsFor = function(index) { + var call = calls[index]; + return call ? call.args : []; + }; + + /** + * Get the "this" object that was passed to a specific invocation of this spy. + * @name Spy#calls#thisFor + * @since 3.8.0 + * @function + * @param {Integer} index The 0-based invocation index. + * @return {Object?} + */ + this.thisFor = function(index) { + var call = calls[index]; + return call ? call.object : undefined; + }; + + /** + * Get the raw calls array for this spy. + * @name Spy#calls#all + * @since 2.0.0 + * @function + * @return {Spy.callData[]} + */ + this.all = function() { + return calls; + }; + + /** + * Get all of the arguments for each invocation of this spy in the order they were received. + * @name Spy#calls#allArgs + * @since 2.0.0 + * @function + * @return {Array} + */ + this.allArgs = function() { + var callArgs = []; + for (var i = 0; i < calls.length; i++) { + callArgs.push(calls[i].args); + } + + return callArgs; + }; + + /** + * Get the first invocation of this spy. + * @name Spy#calls#first + * @since 2.0.0 + * @function + * @return {ObjecSpy.callData} + */ + this.first = function() { + return calls[0]; + }; + + /** + * Get the most recent invocation of this spy. + * @name Spy#calls#mostRecent + * @since 2.0.0 + * @function + * @return {ObjecSpy.callData} + */ + this.mostRecent = function() { + return calls[calls.length - 1]; + }; + + /** + * Reset this spy as if it has never been called. + * @name Spy#calls#reset + * @since 2.0.0 + * @function + */ + this.reset = function() { + calls = []; + }; + + /** + * Set this spy to do a shallow clone of arguments passed to each invocation. + * @name Spy#calls#saveArgumentsByValue + * @since 2.5.0 + * @function + */ + this.saveArgumentsByValue = function() { + opts.cloneArgs = true; + }; + } + + return CallTracker; +}; + +getJasmineRequireObj().clearStack = function(j$) { + var maxInlineCallCount = 10; + + function messageChannelImpl(global, setTimeout) { + var channel = new global.MessageChannel(), + head = {}, + tail = head; + + var taskRunning = false; + channel.port1.onmessage = function() { + head = head.next; + var task = head.task; + delete head.task; + + if (taskRunning) { + global.setTimeout(task, 0); + } else { + try { + taskRunning = true; + task(); + } finally { + taskRunning = false; + } + } + }; + + var currentCallCount = 0; + return function clearStack(fn) { + currentCallCount++; + + if (currentCallCount < maxInlineCallCount) { + tail = tail.next = { task: fn }; + channel.port2.postMessage(0); + } else { + currentCallCount = 0; + setTimeout(fn); + } + }; + } + + function getClearStack(global) { + var currentCallCount = 0; + var realSetTimeout = global.setTimeout; + var setTimeoutImpl = function clearStack(fn) { + Function.prototype.apply.apply(realSetTimeout, [global, [fn, 0]]); + }; + + if (j$.isFunction_(global.setImmediate)) { + var realSetImmediate = global.setImmediate; + return function(fn) { + currentCallCount++; + + if (currentCallCount < maxInlineCallCount) { + realSetImmediate(fn); + } else { + currentCallCount = 0; + + setTimeoutImpl(fn); + } + }; + } else if (!j$.util.isUndefined(global.MessageChannel)) { + return messageChannelImpl(global, setTimeoutImpl); + } else { + return setTimeoutImpl; + } + } + + return getClearStack; +}; + +getJasmineRequireObj().Clock = function() { + /* global process */ + var NODE_JS = + typeof process !== 'undefined' && + process.versions && + typeof process.versions.node === 'string'; + + /** + * @class Clock + * @since 1.3.0 + * @classdesc Jasmine's mock clock is used when testing time dependent code.
+ * _Note:_ Do not construct this directly. You can get the current clock with + * {@link jasmine.clock}. + * @hideconstructor + */ + function Clock(global, delayedFunctionSchedulerFactory, mockDate) { + var self = this, + realTimingFunctions = { + setTimeout: global.setTimeout, + clearTimeout: global.clearTimeout, + setInterval: global.setInterval, + clearInterval: global.clearInterval + }, + fakeTimingFunctions = { + setTimeout: setTimeout, + clearTimeout: clearTimeout, + setInterval: setInterval, + clearInterval: clearInterval + }, + installed = false, + delayedFunctionScheduler, + timer; + + self.FakeTimeout = FakeTimeout; + + /** + * Install the mock clock over the built-in methods. + * @name Clock#install + * @since 2.0.0 + * @function + * @return {Clock} + */ + self.install = function() { + if (!originalTimingFunctionsIntact()) { + throw new Error( + 'Jasmine Clock was unable to install over custom global timer functions. Is the clock already installed?' + ); + } + replace(global, fakeTimingFunctions); + timer = fakeTimingFunctions; + delayedFunctionScheduler = delayedFunctionSchedulerFactory(); + installed = true; + + return self; + }; + + /** + * Uninstall the mock clock, returning the built-in methods to their places. + * @name Clock#uninstall + * @since 2.0.0 + * @function + */ + self.uninstall = function() { + delayedFunctionScheduler = null; + mockDate.uninstall(); + replace(global, realTimingFunctions); + + timer = realTimingFunctions; + installed = false; + }; + + /** + * Execute a function with a mocked Clock + * + * The clock will be {@link Clock#install|install}ed before the function is called and {@link Clock#uninstall|uninstall}ed in a `finally` after the function completes. + * @name Clock#withMock + * @since 2.3.0 + * @function + * @param {Function} closure The function to be called. + */ + self.withMock = function(closure) { + this.install(); + try { + closure(); + } finally { + this.uninstall(); + } + }; + + /** + * Instruct the installed Clock to also mock the date returned by `new Date()` + * @name Clock#mockDate + * @since 2.1.0 + * @function + * @param {Date} [initialDate=now] The `Date` to provide. + */ + self.mockDate = function(initialDate) { + mockDate.install(initialDate); + }; + + self.setTimeout = function(fn, delay, params) { + return Function.prototype.apply.apply(timer.setTimeout, [ + global, + arguments + ]); + }; + + self.setInterval = function(fn, delay, params) { + return Function.prototype.apply.apply(timer.setInterval, [ + global, + arguments + ]); + }; + + self.clearTimeout = function(id) { + return Function.prototype.call.apply(timer.clearTimeout, [global, id]); + }; + + self.clearInterval = function(id) { + return Function.prototype.call.apply(timer.clearInterval, [global, id]); + }; + + /** + * Tick the Clock forward, running any enqueued timeouts along the way + * @name Clock#tick + * @since 1.3.0 + * @function + * @param {int} millis The number of milliseconds to tick. + */ + self.tick = function(millis) { + if (installed) { + delayedFunctionScheduler.tick(millis, function(millis) { + mockDate.tick(millis); + }); + } else { + throw new Error( + 'Mock clock is not installed, use jasmine.clock().install()' + ); + } + }; + + return self; + + function originalTimingFunctionsIntact() { + return ( + global.setTimeout === realTimingFunctions.setTimeout && + global.clearTimeout === realTimingFunctions.clearTimeout && + global.setInterval === realTimingFunctions.setInterval && + global.clearInterval === realTimingFunctions.clearInterval + ); + } + + function replace(dest, source) { + for (var prop in source) { + dest[prop] = source[prop]; + } + } + + function setTimeout(fn, delay) { + if (!NODE_JS) { + return delayedFunctionScheduler.scheduleFunction( + fn, + delay, + argSlice(arguments, 2) + ); + } + + var timeout = new FakeTimeout(); + + delayedFunctionScheduler.scheduleFunction( + fn, + delay, + argSlice(arguments, 2), + false, + timeout + ); + + return timeout; + } + + function clearTimeout(id) { + return delayedFunctionScheduler.removeFunctionWithId(id); + } + + function setInterval(fn, interval) { + if (!NODE_JS) { + return delayedFunctionScheduler.scheduleFunction( + fn, + interval, + argSlice(arguments, 2), + true + ); + } + + var timeout = new FakeTimeout(); + + delayedFunctionScheduler.scheduleFunction( + fn, + interval, + argSlice(arguments, 2), + true, + timeout + ); + + return timeout; + } + + function clearInterval(id) { + return delayedFunctionScheduler.removeFunctionWithId(id); + } + + function argSlice(argsObj, n) { + return Array.prototype.slice.call(argsObj, n); + } + } + + /** + * Mocks Node.js Timeout class + */ + function FakeTimeout() {} + + FakeTimeout.prototype.ref = function() { + return this; + }; + + FakeTimeout.prototype.unref = function() { + return this; + }; + + return Clock; +}; + +getJasmineRequireObj().DelayedFunctionScheduler = function(j$) { + function DelayedFunctionScheduler() { + var self = this; + var scheduledLookup = []; + var scheduledFunctions = {}; + var currentTime = 0; + var delayedFnCount = 0; + var deletedKeys = []; ++ var ticking = false; + + self.tick = function(millis, tickDate) { - millis = millis || 0; - var endTime = currentTime + millis; ++ if (ticking) { ++ j$.getEnv().deprecated( ++ 'The behavior of reentrant calls to jasmine.clock().tick() will ' + ++ 'change in a future version. Either modify the affected spec to ' + ++ 'not call tick() from within a setTimeout or setInterval handler, ' + ++ 'or be aware that it may behave differently in the future. See ' + ++ ' ' + ++ 'for details.' ++ ); ++ } ++ ++ ticking = true; ++ ++ try { ++ millis = millis || 0; ++ var endTime = currentTime + millis; + - runScheduledFunctions(endTime, tickDate); - currentTime = endTime; ++ runScheduledFunctions(endTime, tickDate); ++ currentTime = endTime; ++ } finally { ++ ticking = false; ++ } + }; + + self.scheduleFunction = function( + funcToCall, + millis, + params, + recurring, + timeoutKey, + runAtMillis + ) { + var f; + if (typeof funcToCall === 'string') { + /* jshint evil: true */ + f = function() { + return eval(funcToCall); + }; + /* jshint evil: false */ + } else { + f = funcToCall; + } + + millis = millis || 0; + timeoutKey = timeoutKey || ++delayedFnCount; + runAtMillis = runAtMillis || currentTime + millis; + + var funcToSchedule = { + runAtMillis: runAtMillis, + funcToCall: f, + recurring: recurring, + params: params, + timeoutKey: timeoutKey, + millis: millis + }; + + if (runAtMillis in scheduledFunctions) { + scheduledFunctions[runAtMillis].push(funcToSchedule); + } else { + scheduledFunctions[runAtMillis] = [funcToSchedule]; + scheduledLookup.push(runAtMillis); + scheduledLookup.sort(function(a, b) { + return a - b; + }); + } + + return timeoutKey; + }; + + self.removeFunctionWithId = function(timeoutKey) { + deletedKeys.push(timeoutKey); + + for (var runAtMillis in scheduledFunctions) { + var funcs = scheduledFunctions[runAtMillis]; + var i = indexOfFirstToPass(funcs, function(func) { + return func.timeoutKey === timeoutKey; + }); + + if (i > -1) { + if (funcs.length === 1) { + delete scheduledFunctions[runAtMillis]; + deleteFromLookup(runAtMillis); + } else { + funcs.splice(i, 1); + } + + // intervals get rescheduled when executed, so there's never more + // than a single scheduled function with a given timeoutKey + break; + } + } + }; + + return self; + + function indexOfFirstToPass(array, testFn) { + var index = -1; + + for (var i = 0; i < array.length; ++i) { + if (testFn(array[i])) { + index = i; + break; + } + } + + return index; + } + + function deleteFromLookup(key) { + var value = Number(key); + var i = indexOfFirstToPass(scheduledLookup, function(millis) { + return millis === value; + }); + + if (i > -1) { + scheduledLookup.splice(i, 1); + } + } + + function reschedule(scheduledFn) { + self.scheduleFunction( + scheduledFn.funcToCall, + scheduledFn.millis, + scheduledFn.params, + true, + scheduledFn.timeoutKey, + scheduledFn.runAtMillis + scheduledFn.millis + ); + } + + function forEachFunction(funcsToRun, callback) { + for (var i = 0; i < funcsToRun.length; ++i) { + callback(funcsToRun[i]); + } + } + + function runScheduledFunctions(endTime, tickDate) { + tickDate = tickDate || function() {}; + if (scheduledLookup.length === 0 || scheduledLookup[0] > endTime) { + tickDate(endTime - currentTime); + return; + } + + do { + deletedKeys = []; + var newCurrentTime = scheduledLookup.shift(); + tickDate(newCurrentTime - currentTime); + + currentTime = newCurrentTime; + + var funcsToRun = scheduledFunctions[currentTime]; + + delete scheduledFunctions[currentTime]; + + forEachFunction(funcsToRun, function(funcToRun) { + if (funcToRun.recurring) { + reschedule(funcToRun); + } + }); + + forEachFunction(funcsToRun, function(funcToRun) { + if (j$.util.arrayContains(deletedKeys, funcToRun.timeoutKey)) { + // skip a timeoutKey deleted whilst we were running + return; + } + funcToRun.funcToCall.apply(null, funcToRun.params || []); + }); + deletedKeys = []; + } while ( + scheduledLookup.length > 0 && + // checking first if we're out of time prevents setTimeout(0) + // scheduled in a funcToRun from forcing an extra iteration + currentTime !== endTime && + scheduledLookup[0] <= endTime + ); + + // ran out of functions to call, but still time left on the clock + if (currentTime !== endTime) { + tickDate(endTime - currentTime); + } + } + } + + return DelayedFunctionScheduler; +}; + ++/* eslint-disable compat/compat */ ++// TODO: Remove this in the next major release. ++getJasmineRequireObj().deprecatingSpecProxy = function(j$) { ++ function isMember(target, prop) { ++ return ( ++ Object.keys(target).indexOf(prop) !== -1 || ++ Object.keys(j$.Spec.prototype).indexOf(prop) !== -1 ++ ); ++ } ++ ++ function isAllowedMember(prop) { ++ return prop === 'id' || prop === 'description' || prop === 'getFullName'; ++ } ++ ++ function msg(member) { ++ var memberName = member.toString().replace(/^Symbol\((.+)\)$/, '$1'); ++ return ( ++ 'Access to private Spec members (in this case `' + ++ memberName + ++ '`) is not supported and will break in ' + ++ 'a future release. See ' + ++ 'for correct usage.' ++ ); ++ } ++ ++ try { ++ new Proxy({}, {}); ++ } catch (e) { ++ // Environment does not support Poxy. ++ return function(spec) { ++ return spec; ++ }; ++ } ++ ++ function DeprecatingSpecProxyHandler(env) { ++ this._env = env; ++ } ++ ++ DeprecatingSpecProxyHandler.prototype.get = function(target, prop, receiver) { ++ this._maybeDeprecate(target, prop); ++ ++ if (prop === 'getFullName') { ++ // getFullName calls a private method. Re-bind 'this' to avoid a bogus ++ // deprecation warning. ++ return target.getFullName.bind(target); ++ } else { ++ return target[prop]; ++ } ++ }; ++ ++ DeprecatingSpecProxyHandler.prototype.set = function(target, prop, value) { ++ this._maybeDeprecate(target, prop); ++ return (target[prop] = value); ++ }; ++ ++ DeprecatingSpecProxyHandler.prototype._maybeDeprecate = function( ++ target, ++ prop ++ ) { ++ if (isMember(target, prop) && !isAllowedMember(prop)) { ++ this._env.deprecated(msg(prop)); ++ } ++ }; ++ ++ function deprecatingSpecProxy(spec, env) { ++ return new Proxy(spec, new DeprecatingSpecProxyHandler(env)); ++ } ++ ++ return deprecatingSpecProxy; ++}; ++ ++/* eslint-disable compat/compat */ ++// TODO: Remove this in the next major release. ++getJasmineRequireObj().deprecatingSuiteProxy = function(j$) { ++ var allowedMembers = [ ++ 'id', ++ 'children', ++ 'description', ++ 'parentSuite', ++ 'getFullName' ++ ]; ++ ++ function isMember(target, prop) { ++ return ( ++ Object.keys(target).indexOf(prop) !== -1 || ++ Object.keys(j$.Suite.prototype).indexOf(prop) !== -1 ++ ); ++ } ++ ++ function isAllowedMember(prop) { ++ return allowedMembers.indexOf(prop) !== -1; ++ } ++ ++ function msg(member) { ++ var memberName = member.toString().replace(/^Symbol\((.+)\)$/, '$1'); ++ return ( ++ 'Access to private Suite members (in this case `' + ++ memberName + ++ '`) is not supported and will break in ' + ++ 'a future release. See ' + ++ 'for correct usage.' ++ ); ++ } ++ try { ++ new Proxy({}, {}); ++ } catch (e) { ++ // Environment does not support Poxy. ++ return function(suite) { ++ return suite; ++ }; ++ } ++ ++ function DeprecatingSuiteProxyHandler(parentSuite, env) { ++ this._parentSuite = parentSuite; ++ this._env = env; ++ } ++ ++ DeprecatingSuiteProxyHandler.prototype.get = function( ++ target, ++ prop, ++ receiver ++ ) { ++ if (prop === 'children') { ++ if (!this._children) { ++ this._children = target.children.map( ++ this._proxyForChild.bind(this, receiver) ++ ); ++ } ++ ++ return this._children; ++ } else if (prop === 'parentSuite') { ++ return this._parentSuite; ++ } else { ++ this._maybeDeprecate(target, prop); ++ return target[prop]; ++ } ++ }; ++ ++ DeprecatingSuiteProxyHandler.prototype.set = function(target, prop, value) { ++ this._maybeDeprecate(target, prop); ++ return (target[prop] = value); ++ }; ++ ++ DeprecatingSuiteProxyHandler.prototype._maybeDeprecate = function( ++ target, ++ prop ++ ) { ++ if (isMember(target, prop) && !isAllowedMember(prop)) { ++ this._env.deprecated(msg(prop)); ++ } ++ }; ++ ++ DeprecatingSuiteProxyHandler.prototype._proxyForChild = function( ++ ownProxy, ++ child ++ ) { ++ if (child.children) { ++ return deprecatingSuiteProxy(child, ownProxy, this._env); ++ } else { ++ return j$.deprecatingSpecProxy(child, this._env); ++ } ++ }; ++ ++ function deprecatingSuiteProxy(suite, parentSuite, env) { ++ return new Proxy(suite, new DeprecatingSuiteProxyHandler(parentSuite, env)); ++ } ++ ++ return deprecatingSuiteProxy; ++}; ++ ++/* eslint-disable compat/compat */ ++// TODO: Remove this in the next major release. ++getJasmineRequireObj().deprecatingThisProxy = function(j$) { ++ var msg = ++ "Access to 'this' in describe functions (and in arrow functions " + ++ 'inside describe functions) is deprecated.'; ++ ++ try { ++ new Proxy({}, {}); ++ } catch (e) { ++ // Environment does not support Poxy. ++ return function(suite) { ++ return suite; ++ }; ++ } ++ ++ function DeprecatingThisProxyHandler(env) { ++ this._env = env; ++ } ++ ++ DeprecatingThisProxyHandler.prototype.get = function(target, prop, receiver) { ++ this._env.deprecated(msg); ++ return target[prop]; ++ }; ++ ++ DeprecatingThisProxyHandler.prototype.set = function(target, prop, value) { ++ this._env.deprecated(msg); ++ return (target[prop] = value); ++ }; ++ ++ return function(suite, env) { ++ return new Proxy(suite, new DeprecatingThisProxyHandler(env)); ++ }; ++}; ++ ++getJasmineRequireObj().Deprecator = function(j$) { ++ function Deprecator(topSuite) { ++ this.topSuite_ = topSuite; ++ this.verbose_ = false; ++ this.toSuppress_ = []; ++ } ++ ++ var verboseNote = ++ 'Note: This message will be shown only once. Set the verboseDeprecations ' + ++ 'config property to true to see every occurrence.'; ++ ++ Deprecator.prototype.verboseDeprecations = function(enabled) { ++ this.verbose_ = enabled; ++ }; ++ ++ // runnable is a spec or a suite. ++ // deprecation is a string or an Error. ++ // See Env#deprecated for a description of the options argument. ++ Deprecator.prototype.addDeprecationWarning = function( ++ runnable, ++ deprecation, ++ options ++ ) { ++ options = options || {}; ++ ++ if (!this.verbose_ && !j$.isError_(deprecation)) { ++ if (this.toSuppress_.indexOf(deprecation) !== -1) { ++ return; ++ } ++ this.toSuppress_.push(deprecation); ++ } ++ ++ this.log_(runnable, deprecation, options); ++ this.report_(runnable, deprecation, options); ++ }; ++ ++ Deprecator.prototype.log_ = function(runnable, deprecation, options) { ++ var context; ++ ++ if (j$.isError_(deprecation)) { ++ console.error(deprecation); ++ return; ++ } ++ ++ if (runnable === this.topSuite_ || options.ignoreRunnable) { ++ context = ''; ++ } else if (runnable.children) { ++ context = ' (in suite: ' + runnable.getFullName() + ')'; ++ } else { ++ context = ' (in spec: ' + runnable.getFullName() + ')'; ++ } ++ ++ if (!options.omitStackTrace) { ++ context += '\n' + this.stackTrace_(); ++ } ++ ++ if (!this.verbose_) { ++ context += '\n' + verboseNote; ++ } ++ ++ console.error('DEPRECATION: ' + deprecation + context); ++ }; ++ ++ Deprecator.prototype.stackTrace_ = function() { ++ var formatter = new j$.ExceptionFormatter(); ++ return formatter.stack(j$.util.errorWithStack()).replace(/^Error\n/m, ''); ++ }; ++ ++ Deprecator.prototype.report_ = function(runnable, deprecation, options) { ++ if (options.ignoreRunnable) { ++ runnable = this.topSuite_; ++ } ++ ++ if (j$.isError_(deprecation)) { ++ runnable.addDeprecationWarning(deprecation); ++ return; ++ } ++ ++ if (!this.verbose_) { ++ deprecation += '\n' + verboseNote; ++ } ++ ++ runnable.addDeprecationWarning({ ++ message: deprecation, ++ omitStackTrace: options.omitStackTrace || false ++ }); ++ }; ++ ++ return Deprecator; ++}; ++ +getJasmineRequireObj().errors = function() { + function ExpectationFailed() {} + + ExpectationFailed.prototype = new Error(); + ExpectationFailed.prototype.constructor = ExpectationFailed; + + return { + ExpectationFailed: ExpectationFailed + }; +}; + +getJasmineRequireObj().ExceptionFormatter = function(j$) { + var ignoredProperties = [ + 'name', + 'message', + 'stack', + 'fileName', + 'sourceURL', + 'line', + 'lineNumber', + 'column', + 'description', + 'jasmineMessage' + ]; + + function ExceptionFormatter(options) { + var jasmineFile = (options && options.jasmineFile) || j$.util.jasmineFile(); + this.message = function(error) { + var message = ''; + + if (error.jasmineMessage) { + message += error.jasmineMessage; + } else if (error.name && error.message) { + message += error.name + ': ' + error.message; + } else if (error.message) { + message += error.message; + } else { + message += error.toString() + ' thrown'; + } + + if (error.fileName || error.sourceURL) { + message += ' in ' + (error.fileName || error.sourceURL); + } + + if (error.line || error.lineNumber) { + message += ' (line ' + (error.line || error.lineNumber) + ')'; + } + + return message; + }; + + this.stack = function(error) { + if (!error || !error.stack) { + return null; + } + + var stackTrace = new j$.StackTrace(error); + var lines = filterJasmine(stackTrace); + var result = ''; + + if (stackTrace.message) { + lines.unshift(stackTrace.message); + } + + result += formatProperties(error); + result += lines.join('\n'); + + return result; + }; + + function filterJasmine(stackTrace) { + var result = [], + jasmineMarker = + stackTrace.style === 'webkit' ? '' : ' at '; + + stackTrace.frames.forEach(function(frame) { + if (frame.file !== jasmineFile) { + result.push(frame.raw); + } else if (result[result.length - 1] !== jasmineMarker) { + result.push(jasmineMarker); + } + }); + + return result; + } + + function formatProperties(error) { + if (!(error instanceof Object)) { + return; + } + + var result = {}; + var empty = true; + + for (var prop in error) { + if (j$.util.arrayContains(ignoredProperties, prop)) { + continue; + } + result[prop] = error[prop]; + empty = false; + } + + if (!empty) { - return 'error properties: ' + j$.pp(result) + '\n'; ++ return 'error properties: ' + j$.basicPrettyPrinter_(result) + '\n'; + } + + return ''; + } + } + + return ExceptionFormatter; +}; + +getJasmineRequireObj().Expectation = function(j$) { + /** + * Matchers that come with Jasmine out of the box. + * @namespace matchers + */ + function Expectation(options) { + this.expector = new j$.Expector(options); + + var customMatchers = options.customMatchers || {}; + for (var matcherName in customMatchers) { + this[matcherName] = wrapSyncCompare( + matcherName, + customMatchers[matcherName] + ); + } + } + + /** + * Add some context for an {@link expect} + * @function + * @name matchers#withContext + * @since 3.3.0 + * @param {String} message - Additional context to show when the matcher fails + * @return {matchers} + */ + Expectation.prototype.withContext = function withContext(message) { + return addFilter(this, new ContextAddingFilter(message)); + }; + + /** + * Invert the matcher following this {@link expect} + * @member + * @name matchers#not + * @since 1.3.0 + * @type {matchers} + * @example + * expect(something).not.toBe(true); + */ + Object.defineProperty(Expectation.prototype, 'not', { + get: function() { + return addFilter(this, syncNegatingFilter); + } + }); + + /** + * Asynchronous matchers that operate on an actual value which is a promise, + * and return a promise. + * + * Most async matchers will wait indefinitely for the promise to be resolved + * or rejected, resulting in a spec timeout if that never happens. If you + * expect that the promise will already be resolved or rejected at the time + * the matcher is called, you can use the {@link async-matchers#already} + * modifier to get a faster failure with a more helpful message. + * + * Note: Specs must await the result of each async matcher, return the + * promise returned by the matcher, or return a promise that's derived from + * the one returned by the matcher. Otherwise the matcher will not be + * evaluated before the spec completes. + * + * @example + * // Good + * await expectAsync(aPromise).toBeResolved(); + * @example + * // Good + * return expectAsync(aPromise).toBeResolved(); + * @example + * // Good + * return expectAsync(aPromise).toBeResolved() + * .then(function() { + * // more spec code + * }); + * @example + * // Bad + * expectAsync(aPromise).toBeResolved(); + * @namespace async-matchers + */ + function AsyncExpectation(options) { + var global = options.global || j$.getGlobal(); + this.expector = new j$.Expector(options); + + if (!global.Promise) { + throw new Error( + 'expectAsync is unavailable because the environment does not support promises.' + ); + } + + var customAsyncMatchers = options.customAsyncMatchers || {}; + for (var matcherName in customAsyncMatchers) { + this[matcherName] = wrapAsyncCompare( + matcherName, + customAsyncMatchers[matcherName] + ); + } + } + + /** + * Add some context for an {@link expectAsync} + * @function + * @name async-matchers#withContext + * @since 3.3.0 + * @param {String} message - Additional context to show when the async matcher fails + * @return {async-matchers} + */ + AsyncExpectation.prototype.withContext = function withContext(message) { + return addFilter(this, new ContextAddingFilter(message)); + }; + + /** + * Invert the matcher following this {@link expectAsync} + * @member + * @name async-matchers#not + * @type {async-matchers} + * @example + * await expectAsync(myPromise).not.toBeResolved(); + * @example + * return expectAsync(myPromise).not.toBeResolved(); + */ + Object.defineProperty(AsyncExpectation.prototype, 'not', { + get: function() { + return addFilter(this, asyncNegatingFilter); + } + }); + + /** + * Fail as soon as possible if the actual is pending. + * Otherwise evaluate the matcher. + * @member + * @name async-matchers#already + * @since 3.8.0 + * @type {async-matchers} + * @example + * await expectAsync(myPromise).already.toBeResolved(); + * @example + * return expectAsync(myPromise).already.toBeResolved(); + */ + Object.defineProperty(AsyncExpectation.prototype, 'already', { + get: function() { + return addFilter(this, expectSettledPromiseFilter); + } + }); + + function wrapSyncCompare(name, matcherFactory) { + return function() { + var result = this.expector.compare(name, matcherFactory, arguments); + this.expector.processResult(result); + }; + } + + function wrapAsyncCompare(name, matcherFactory) { + return function() { + var self = this; + + // Capture the call stack here, before we go async, so that it will contain + // frames that are relevant to the user instead of just parts of Jasmine. + var errorForStack = j$.util.errorWithStack(); + + return this.expector + .compare(name, matcherFactory, arguments) + .then(function(result) { + self.expector.processResult(result, errorForStack); + }); + }; + } + + function addCoreMatchers(prototype, matchers, wrapper) { + for (var matcherName in matchers) { + var matcher = matchers[matcherName]; + prototype[matcherName] = wrapper(matcherName, matcher); + } + } + + function addFilter(source, filter) { + var result = Object.create(source); + result.expector = source.expector.addFilter(filter); + return result; + } + + function negatedFailureMessage(result, matcherName, args, matchersUtil) { + if (result.message) { + if (j$.isFunction_(result.message)) { + return result.message(); + } else { + return result.message; + } + } + + args = args.slice(); + args.unshift(true); + args.unshift(matcherName); + return matchersUtil.buildFailureMessage.apply(matchersUtil, args); + } + + function negate(result) { + result.pass = !result.pass; + return result; + } + + var syncNegatingFilter = { + selectComparisonFunc: function(matcher) { + function defaultNegativeCompare() { + return negate(matcher.compare.apply(null, arguments)); + } + + return matcher.negativeCompare || defaultNegativeCompare; + }, + buildFailureMessage: negatedFailureMessage + }; + + var asyncNegatingFilter = { + selectComparisonFunc: function(matcher) { + function defaultNegativeCompare() { + return matcher.compare.apply(this, arguments).then(negate); + } + + return matcher.negativeCompare || defaultNegativeCompare; + }, + buildFailureMessage: negatedFailureMessage + }; + + var expectSettledPromiseFilter = { + selectComparisonFunc: function(matcher) { + return function(actual) { + var matcherArgs = arguments; + + return j$.isPending_(actual).then(function(isPending) { + if (isPending) { + return { + pass: false, + message: + 'Expected a promise to be settled (via ' + + 'expectAsync(...).already) but it was pending.' + }; + } else { + return matcher.compare.apply(null, matcherArgs); + } + }); + }; + } + }; + + function ContextAddingFilter(message) { + this.message = message; + } + + ContextAddingFilter.prototype.modifyFailureMessage = function(msg) { + var nl = msg.indexOf('\n'); + + if (nl === -1) { + return this.message + ': ' + msg; + } else { + return this.message + ':\n' + indent(msg); + } + }; + + function indent(s) { + return s.replace(/^/gm, ' '); + } + + return { + factory: function(options) { + return new Expectation(options || {}); + }, + addCoreMatchers: function(matchers) { + addCoreMatchers(Expectation.prototype, matchers, wrapSyncCompare); + }, + asyncFactory: function(options) { + return new AsyncExpectation(options || {}); + }, + addAsyncCoreMatchers: function(matchers) { + addCoreMatchers(AsyncExpectation.prototype, matchers, wrapAsyncCompare); + } + }; +}; + +getJasmineRequireObj().ExpectationFilterChain = function() { + function ExpectationFilterChain(maybeFilter, prev) { + this.filter_ = maybeFilter; + this.prev_ = prev; + } + + ExpectationFilterChain.prototype.addFilter = function(filter) { + return new ExpectationFilterChain(filter, this); + }; + + ExpectationFilterChain.prototype.selectComparisonFunc = function(matcher) { + return this.callFirst_('selectComparisonFunc', arguments).result; + }; + + ExpectationFilterChain.prototype.buildFailureMessage = function( + result, + matcherName, + args, + matchersUtil + ) { + return this.callFirst_('buildFailureMessage', arguments).result; + }; + + ExpectationFilterChain.prototype.modifyFailureMessage = function(msg) { + var result = this.callFirst_('modifyFailureMessage', arguments).result; + return result || msg; + }; + + ExpectationFilterChain.prototype.callFirst_ = function(fname, args) { + var prevResult; + + if (this.prev_) { + prevResult = this.prev_.callFirst_(fname, args); + + if (prevResult.found) { + return prevResult; + } + } + + if (this.filter_ && this.filter_[fname]) { + return { + found: true, + result: this.filter_[fname].apply(this.filter_, args) + }; + } + + return { found: false }; + }; + + return ExpectationFilterChain; +}; + +//TODO: expectation result may make more sense as a presentation of an expectation. +getJasmineRequireObj().buildExpectationResult = function(j$) { + function buildExpectationResult(options) { + var messageFormatter = options.messageFormatter || function() {}, + stackFormatter = options.stackFormatter || function() {}; + + /** + * @typedef Expectation + * @property {String} matcherName - The name of the matcher that was executed for this expectation. + * @property {String} message - The failure message for the expectation. + * @property {String} stack - The stack trace for the failure if available. + * @property {Boolean} passed - Whether the expectation passed or failed. + * @property {Object} expected - If the expectation failed, what was the expected value. + * @property {Object} actual - If the expectation failed, what actual value was produced. + */ + var result = { + matcherName: options.matcherName, + message: message(), - stack: stack(), ++ stack: options.omitStackTrace ? '' : stack(), + passed: options.passed + }; + + if (!result.passed) { + result.expected = options.expected; + result.actual = options.actual; + + if (options.error && !j$.isString_(options.error)) { + if ('code' in options.error) { + result.code = options.error.code; + } + + if ( + options.error.code === 'ERR_ASSERTION' && + options.expected === '' && + options.actual === '' + ) { + result.expected = options.error.expected; + result.actual = options.error.actual; + result.matcherName = 'assert ' + options.error.operator; + } + } + } + + return result; + + function message() { + if (options.passed) { + return 'Passed.'; + } else if (options.message) { + return options.message; + } else if (options.error) { + return messageFormatter(options.error); + } + return ''; + } + + function stack() { + if (options.passed) { + return ''; + } + + var error = options.error; + if (!error) { + if (options.errorForStack) { + error = options.errorForStack; + } else if (options.stack) { + error = options; + } else { + try { + throw new Error(message()); + } catch (e) { + error = e; + } + } + } + return stackFormatter(error); + } + } + + return buildExpectationResult; +}; + +getJasmineRequireObj().Expector = function(j$) { + function Expector(options) { + this.matchersUtil = options.matchersUtil || { + buildFailureMessage: function() {} + }; + this.customEqualityTesters = options.customEqualityTesters || []; + this.actual = options.actual; + this.addExpectationResult = options.addExpectationResult || function() {}; + this.filters = new j$.ExpectationFilterChain(); + } + + Expector.prototype.instantiateMatcher = function( + matcherName, + matcherFactory, + args + ) { + this.matcherName = matcherName; + this.args = Array.prototype.slice.call(args, 0); + this.expected = this.args.slice(0); + + this.args.unshift(this.actual); + - var matcher = matcherFactory(this.matchersUtil, this.customEqualityTesters); ++ // TODO: Remove support for passing customEqualityTesters in the next major release. ++ var matcher; ++ ++ if (matcherFactory.length >= 2) { ++ matcher = matcherFactory(this.matchersUtil, this.customEqualityTesters); ++ } else { ++ matcher = matcherFactory(this.matchersUtil); ++ } ++ + var comparisonFunc = this.filters.selectComparisonFunc(matcher); + return comparisonFunc || matcher.compare; + }; + + Expector.prototype.buildMessage = function(result) { + var self = this; + + if (result.pass) { + return ''; + } + + var msg = this.filters.buildFailureMessage( + result, + this.matcherName, + this.args, + this.matchersUtil, + defaultMessage + ); + return this.filters.modifyFailureMessage(msg || defaultMessage()); + + function defaultMessage() { + if (!result.message) { + var args = self.args.slice(); + args.unshift(false); + args.unshift(self.matcherName); + return self.matchersUtil.buildFailureMessage.apply( + self.matchersUtil, + args + ); + } else if (j$.isFunction_(result.message)) { + return result.message(); + } else { + return result.message; + } + } + }; + + Expector.prototype.compare = function(matcherName, matcherFactory, args) { + var matcherCompare = this.instantiateMatcher( + matcherName, + matcherFactory, + args + ); + return matcherCompare.apply(null, this.args); + }; + + Expector.prototype.addFilter = function(filter) { + var result = Object.create(this); + result.filters = this.filters.addFilter(filter); + return result; + }; + + Expector.prototype.processResult = function(result, errorForStack) { + var message = this.buildMessage(result); + + if (this.expected.length === 1) { + this.expected = this.expected[0]; + } + + this.addExpectationResult(result.pass, { + matcherName: this.matcherName, + passed: result.pass, + message: message, + error: errorForStack ? undefined : result.error, + errorForStack: errorForStack || undefined, + actual: this.actual, + expected: this.expected // TODO: this may need to be arrayified/sliced + }); + }; + + return Expector; +}; + +getJasmineRequireObj().formatErrorMsg = function() { + function generateErrorMsg(domain, usage) { + var usageDefinition = usage ? '\nUsage: ' + usage : ''; + + return function errorMsg(msg) { + return domain + ' : ' + msg + usageDefinition; + }; + } + + return generateErrorMsg; +}; + +getJasmineRequireObj().GlobalErrors = function(j$) { + function GlobalErrors(global) { + var handlers = []; + global = global || j$.getGlobal(); + + var onerror = function onerror() { + var handler = handlers[handlers.length - 1]; + + if (handler) { + handler.apply(null, Array.prototype.slice.call(arguments, 0)); + } else { + throw arguments[0]; + } + }; + + this.originalHandlers = {}; + this.jasmineHandlers = {}; + this.installOne_ = function installOne_(errorType, jasmineMessage) { + function taggedOnError(error) { + var substituteMsg; + + if (j$.isError_(error)) { + error.jasmineMessage = jasmineMessage + ': ' + error; + } else { + if (error) { + substituteMsg = jasmineMessage + ': ' + error; + } else { + substituteMsg = jasmineMessage + ' with no error or message'; + } + + if (errorType === 'unhandledRejection') { + substituteMsg += + '\n' + + '(Tip: to get a useful stack trace, use ' + + 'Promise.reject(new Error(...)) instead of Promise.reject(' + + (error ? '...' : '') + + ').)'; + } + + error = new Error(substituteMsg); + } + + var handler = handlers[handlers.length - 1]; + + if (handler) { + handler(error); + } else { + throw error; + } + } + + this.originalHandlers[errorType] = global.process.listeners(errorType); + this.jasmineHandlers[errorType] = taggedOnError; + + global.process.removeAllListeners(errorType); + global.process.on(errorType, taggedOnError); + + this.uninstall = function uninstall() { + var errorTypes = Object.keys(this.originalHandlers); + for (var iType = 0; iType < errorTypes.length; iType++) { + var errorType = errorTypes[iType]; + global.process.removeListener( + errorType, + this.jasmineHandlers[errorType] + ); + for (var i = 0; i < this.originalHandlers[errorType].length; i++) { + global.process.on(errorType, this.originalHandlers[errorType][i]); + } + delete this.originalHandlers[errorType]; + delete this.jasmineHandlers[errorType]; + } + }; + }; + + this.install = function install() { + if ( + global.process && + global.process.listeners && + j$.isFunction_(global.process.on) + ) { + this.installOne_('uncaughtException', 'Uncaught exception'); + this.installOne_('unhandledRejection', 'Unhandled promise rejection'); + } else { + var originalHandler = global.onerror; + global.onerror = onerror; + + var browserRejectionHandler = function browserRejectionHandler(event) { + if (j$.isError_(event.reason)) { + event.reason.jasmineMessage = + 'Unhandled promise rejection: ' + event.reason; + global.onerror(event.reason); + } else { + global.onerror('Unhandled promise rejection: ' + event.reason); + } + }; + + if (global.addEventListener) { + global.addEventListener( + 'unhandledrejection', + browserRejectionHandler + ); + } + + this.uninstall = function uninstall() { + global.onerror = originalHandler; + if (global.removeEventListener) { + global.removeEventListener( + 'unhandledrejection', + browserRejectionHandler + ); + } + }; + } + }; + + this.pushListener = function pushListener(listener) { + handlers.push(listener); + }; + + this.popListener = function popListener(listener) { + if (!listener) { + throw new Error('popListener expects a listener'); + } + + handlers.pop(); + }; + } + + return GlobalErrors; +}; + +/* eslint-disable compat/compat */ +getJasmineRequireObj().toBePending = function(j$) { + /** + * Expect a promise to be pending, i.e. the promise is neither resolved nor rejected. + * @function + * @async + * @name async-matchers#toBePending + * @since 3.6 + * @example + * await expectAsync(aPromise).toBePending(); + */ + return function toBePending() { + return { + compare: function(actual) { + if (!j$.isPromiseLike(actual)) { + throw new Error('Expected toBePending to be called on a promise.'); + } + var want = {}; + return Promise.race([actual, Promise.resolve(want)]).then( + function(got) { + return { pass: want === got }; + }, + function() { + return { pass: false }; + } + ); + } + }; + }; +}; + +getJasmineRequireObj().toBeRejected = function(j$) { + /** + * Expect a promise to be rejected. + * @function + * @async + * @name async-matchers#toBeRejected + * @since 3.1.0 + * @example + * await expectAsync(aPromise).toBeRejected(); + * @example + * return expectAsync(aPromise).toBeRejected(); + */ + return function toBeRejected() { + return { + compare: function(actual) { + if (!j$.isPromiseLike(actual)) { + throw new Error('Expected toBeRejected to be called on a promise.'); + } + return actual.then( + function() { + return { pass: false }; + }, + function() { + return { pass: true }; + } + ); + } + }; + }; +}; + +getJasmineRequireObj().toBeRejectedWith = function(j$) { + /** + * Expect a promise to be rejected with a value equal to the expected, using deep equality comparison. + * @function + * @async + * @name async-matchers#toBeRejectedWith + * @since 3.3.0 + * @param {Object} expected - Value that the promise is expected to be rejected with + * @example + * await expectAsync(aPromise).toBeRejectedWith({prop: 'value'}); + * @example + * return expectAsync(aPromise).toBeRejectedWith({prop: 'value'}); + */ + return function toBeRejectedWith(matchersUtil) { + return { + compare: function(actualPromise, expectedValue) { + if (!j$.isPromiseLike(actualPromise)) { + throw new Error( + 'Expected toBeRejectedWith to be called on a promise.' + ); + } + + function prefix(passed) { + return ( + 'Expected a promise ' + + (passed ? 'not ' : '') + + 'to be rejected with ' + + matchersUtil.pp(expectedValue) + ); + } + + return actualPromise.then( + function() { + return { + pass: false, + message: prefix(false) + ' but it was resolved.' + }; + }, + function(actualValue) { + if (matchersUtil.equals(actualValue, expectedValue)) { + return { + pass: true, + message: prefix(true) + '.' + }; + } else { + return { + pass: false, + message: + prefix(false) + + ' but it was rejected with ' + + matchersUtil.pp(actualValue) + + '.' + }; + } + } + ); + } + }; + }; +}; + +getJasmineRequireObj().toBeRejectedWithError = function(j$) { + /** + * Expect a promise to be rejected with a value matched to the expected + * @function + * @async + * @name async-matchers#toBeRejectedWithError + * @since 3.5.0 + * @param {Error} [expected] - `Error` constructor the object that was thrown needs to be an instance of. If not provided, `Error` will be used. + * @param {RegExp|String} [message] - The message that should be set on the thrown `Error` + * @example + * await expectAsync(aPromise).toBeRejectedWithError(MyCustomError, 'Error message'); + * await expectAsync(aPromise).toBeRejectedWithError(MyCustomError, /Error message/); + * await expectAsync(aPromise).toBeRejectedWithError(MyCustomError); + * await expectAsync(aPromise).toBeRejectedWithError('Error message'); + * return expectAsync(aPromise).toBeRejectedWithError(/Error message/); + */ + return function toBeRejectedWithError(matchersUtil) { + return { + compare: function(actualPromise, arg1, arg2) { + if (!j$.isPromiseLike(actualPromise)) { + throw new Error( + 'Expected toBeRejectedWithError to be called on a promise.' + ); + } + + var expected = getExpectedFromArgs(arg1, arg2, matchersUtil); + + return actualPromise.then( + function() { + return { + pass: false, + message: 'Expected a promise to be rejected but it was resolved.' + }; + }, + function(actualValue) { + return matchError(actualValue, expected, matchersUtil); + } + ); + } + }; + }; + + function matchError(actual, expected, matchersUtil) { + if (!j$.isError_(actual)) { + return fail(expected, 'rejected with ' + matchersUtil.pp(actual)); + } + + if (!(actual instanceof expected.error)) { + return fail( + expected, + 'rejected with type ' + j$.fnNameFor(actual.constructor) + ); + } + + var actualMessage = actual.message; + + if ( + actualMessage === expected.message || + typeof expected.message === 'undefined' + ) { + return pass(expected); + } + + if ( + expected.message instanceof RegExp && + expected.message.test(actualMessage) + ) { + return pass(expected); + } + + return fail(expected, 'rejected with ' + matchersUtil.pp(actual)); + } + + function pass(expected) { + return { + pass: true, + message: + 'Expected a promise not to be rejected with ' + + expected.printValue + + ', but it was.' + }; + } + + function fail(expected, message) { + return { + pass: false, + message: + 'Expected a promise to be rejected with ' + + expected.printValue + + ' but it was ' + + message + + '.' + }; + } + + function getExpectedFromArgs(arg1, arg2, matchersUtil) { + var error, message; + + if (isErrorConstructor(arg1)) { + error = arg1; + message = arg2; + } else { + error = Error; + message = arg1; + } + + return { + error: error, + message: message, + printValue: + j$.fnNameFor(error) + + (typeof message === 'undefined' ? '' : ': ' + matchersUtil.pp(message)) + }; + } + + function isErrorConstructor(value) { + return ( + typeof value === 'function' && + (value === Error || j$.isError_(value.prototype)) + ); + } +}; + +getJasmineRequireObj().toBeResolved = function(j$) { + /** + * Expect a promise to be resolved. + * @function + * @async + * @name async-matchers#toBeResolved + * @since 3.1.0 + * @example + * await expectAsync(aPromise).toBeResolved(); + * @example + * return expectAsync(aPromise).toBeResolved(); + */ + return function toBeResolved(matchersUtil) { + return { + compare: function(actual) { + if (!j$.isPromiseLike(actual)) { + throw new Error('Expected toBeResolved to be called on a promise.'); + } + + return actual.then( + function() { + return { pass: true }; + }, + function(e) { + return { + pass: false, + message: + 'Expected a promise to be resolved but it was ' + + 'rejected with ' + + matchersUtil.pp(e) + + '.' + }; + } + ); + } + }; + }; +}; + +getJasmineRequireObj().toBeResolvedTo = function(j$) { + /** + * Expect a promise to be resolved to a value equal to the expected, using deep equality comparison. + * @function + * @async + * @name async-matchers#toBeResolvedTo + * @since 3.1.0 + * @param {Object} expected - Value that the promise is expected to resolve to + * @example + * await expectAsync(aPromise).toBeResolvedTo({prop: 'value'}); + * @example + * return expectAsync(aPromise).toBeResolvedTo({prop: 'value'}); + */ + return function toBeResolvedTo(matchersUtil) { + return { + compare: function(actualPromise, expectedValue) { + if (!j$.isPromiseLike(actualPromise)) { + throw new Error('Expected toBeResolvedTo to be called on a promise.'); + } + + function prefix(passed) { + return ( + 'Expected a promise ' + + (passed ? 'not ' : '') + + 'to be resolved to ' + + matchersUtil.pp(expectedValue) + ); + } + + return actualPromise.then( + function(actualValue) { + if (matchersUtil.equals(actualValue, expectedValue)) { + return { + pass: true, + message: prefix(true) + '.' + }; + } else { + return { + pass: false, + message: + prefix(false) + + ' but it was resolved to ' + + matchersUtil.pp(actualValue) + + '.' + }; + } + }, + function(e) { + return { + pass: false, + message: + prefix(false) + + ' but it was rejected with ' + + matchersUtil.pp(e) + + '.' + }; + } + ); + } + }; + }; +}; + +getJasmineRequireObj().DiffBuilder = function(j$) { + return function DiffBuilder(config) { + var prettyPrinter = (config || {}).prettyPrinter || j$.makePrettyPrinter(), + mismatches = new j$.MismatchTree(), + path = new j$.ObjectPath(), + actualRoot = undefined, + expectedRoot = undefined; + + return { + setRoots: function(actual, expected) { + actualRoot = actual; + expectedRoot = expected; + }, + + recordMismatch: function(formatter) { + mismatches.add(path, formatter); + }, + + getMessage: function() { + var messages = []; + + mismatches.traverse(function(path, isLeaf, formatter) { + var actualCustom, + expectedCustom, + useCustom, + derefResult = dereferencePath( + path, + actualRoot, + expectedRoot, + prettyPrinter + ), + actual = derefResult.actual, + expected = derefResult.expected; + + if (formatter) { + messages.push(formatter(actual, expected, path, prettyPrinter)); + return true; + } + + actualCustom = prettyPrinter.customFormat_(actual); + expectedCustom = prettyPrinter.customFormat_(expected); + useCustom = !( + j$.util.isUndefined(actualCustom) && + j$.util.isUndefined(expectedCustom) + ); + + if (useCustom) { + messages.push( + wrapPrettyPrinted(actualCustom, expectedCustom, path) + ); + return false; // don't recurse further + } + + if (isLeaf) { + messages.push( + defaultFormatter(actual, expected, path, prettyPrinter) + ); + } + + return true; + }); + + return messages.join('\n'); + }, + + withPath: function(pathComponent, block) { + var oldPath = path; + path = path.add(pathComponent); + block(); + path = oldPath; + } + }; + + function defaultFormatter(actual, expected, path, prettyPrinter) { + return wrapPrettyPrinted( + prettyPrinter(actual), + prettyPrinter(expected), + path + ); + } + + function wrapPrettyPrinted(actual, expected, path) { + return ( + 'Expected ' + + path + + (path.depth() ? ' = ' : '') + + actual + + ' to equal ' + + expected + + '.' + ); + } + }; + + function dereferencePath(objectPath, actual, expected, pp) { + function handleAsymmetricExpected() { + if ( + j$.isAsymmetricEqualityTester_(expected) && + j$.isFunction_(expected.valuesForDiff_) + ) { + var asymmetricResult = expected.valuesForDiff_(actual, pp); + expected = asymmetricResult.self; + actual = asymmetricResult.other; + } + } + + var i; + handleAsymmetricExpected(); + + for (i = 0; i < objectPath.components.length; i++) { + actual = actual[objectPath.components[i]]; + expected = expected[objectPath.components[i]]; + handleAsymmetricExpected(); + } + + return { actual: actual, expected: expected }; + } +}; + +getJasmineRequireObj().MatchersUtil = function(j$) { - // TODO: convert all uses of j$.pp to use the injected pp - + /** + * @class MatchersUtil + * @classdesc Utilities for use in implementing matchers.
+ * _Note:_ Do not construct this directly. Jasmine will construct one and + * pass it to matchers and asymmetric equality testers. + * @hideconstructor + */ + function MatchersUtil(options) { + options = options || {}; + this.customTesters_ = options.customTesters || []; + /** + * Formats a value for use in matcher failure messages and similar contexts, + * taking into account the current set of custom value formatters. + * @function + * @name MatchersUtil#pp + * @since 3.6.0 + * @param {*} value The value to pretty-print + * @return {string} The pretty-printed value + */ + this.pp = options.pp || function() {}; + } + + /** + * Determines whether `haystack` contains `needle`, using the same comparison + * logic as {@link MatchersUtil#equals}. + * @function + * @name MatchersUtil#contains + * @since 2.0.0 + * @param {*} haystack The collection to search + * @param {*} needle The value to search for - * @param [customTesters] An array of custom equality testers ++ * @param [customTesters] An array of custom equality testers. Deprecated. ++ * As of 3.6 this parameter no longer needs to be passed. It will be removed in 4.0. + * @returns {boolean} True if `needle` was found in `haystack` + */ + MatchersUtil.prototype.contains = function(haystack, needle, customTesters) { ++ if (customTesters) { ++ j$.getEnv().deprecated( ++ 'Passing custom equality testers ' + ++ 'to MatchersUtil#contains is deprecated. ' + ++ 'See for details.' ++ ); ++ } ++ + if (j$.isSet(haystack)) { + return haystack.has(needle); + } + + if ( + Object.prototype.toString.apply(haystack) === '[object Array]' || + (!!haystack && !haystack.indexOf) + ) { + for (var i = 0; i < haystack.length; i++) { - if (this.equals(haystack[i], needle, customTesters)) { - return true; ++ try { ++ this.suppressDeprecation_ = true; ++ if (this.equals(haystack[i], needle, customTesters)) { ++ return true; ++ } ++ } finally { ++ this.suppressDeprecation_ = false; + } + } + return false; + } + + return !!haystack && haystack.indexOf(needle) >= 0; + }; + + MatchersUtil.prototype.buildFailureMessage = function() { + var self = this; + var args = Array.prototype.slice.call(arguments, 0), + matcherName = args[0], + isNot = args[1], + actual = args[2], + expected = args.slice(3), + englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { + return ' ' + s.toLowerCase(); + }); + + var message = + 'Expected ' + + self.pp(actual) + + (isNot ? ' not ' : ' ') + + englishyPredicate; + + if (expected.length > 0) { + for (var i = 0; i < expected.length; i++) { + if (i > 0) { + message += ','; + } + message += ' ' + self.pp(expected[i]); + } + } + + return message + '.'; + }; + + MatchersUtil.prototype.asymmetricDiff_ = function( + a, + b, + aStack, + bStack, + customTesters, + diffBuilder + ) { + if (j$.isFunction_(b.valuesForDiff_)) { + var values = b.valuesForDiff_(a, this.pp); + this.eq_( + values.other, + values.self, + aStack, + bStack, + customTesters, + diffBuilder + ); + } else { + diffBuilder.recordMismatch(); + } + }; + + MatchersUtil.prototype.asymmetricMatch_ = function( + a, + b, + aStack, + bStack, + customTesters, + diffBuilder + ) { + var asymmetricA = j$.isAsymmetricEqualityTester_(a), + asymmetricB = j$.isAsymmetricEqualityTester_(b), + shim, + result; + + if (asymmetricA === asymmetricB) { + return undefined; + } + + shim = j$.asymmetricEqualityTesterArgCompatShim(this, customTesters); + + if (asymmetricA) { + result = a.asymmetricMatch(b, shim); + if (!result) { + diffBuilder.recordMismatch(); + } + return result; + } + + if (asymmetricB) { + result = b.asymmetricMatch(a, shim); + if (!result) { + this.asymmetricDiff_(a, b, aStack, bStack, customTesters, diffBuilder); + } + return result; + } + }; + + /** + * Determines whether two values are deeply equal to each other. + * @function + * @name MatchersUtil#equals + * @since 2.0.0 + * @param {*} a The first value to compare + * @param {*} b The second value to compare - * @param [customTesters] An array of custom equality testers ++ * @param [customTesters] An array of custom equality testers. Deprecated. ++ * As of 3.6 this parameter no longer needs to be passed. It will be removed in 4.0. + * @returns {boolean} True if the values are equal + */ + MatchersUtil.prototype.equals = function( + a, + b, + customTestersOrDiffBuilder, + diffBuilderOrNothing + ) { + var customTesters, diffBuilder; + + if (isDiffBuilder(customTestersOrDiffBuilder)) { + diffBuilder = customTestersOrDiffBuilder; + } else { ++ if (customTestersOrDiffBuilder && !this.suppressDeprecation_) { ++ j$.getEnv().deprecated( ++ 'Passing custom equality testers ' + ++ 'to MatchersUtil#equals is deprecated. ' + ++ 'See for details.' ++ ); ++ } ++ ++ if (diffBuilderOrNothing) { ++ j$.getEnv().deprecated( ++ 'Diff builder should be passed ' + ++ 'as the third argument to MatchersUtil#equals, not the fourth. ' + ++ 'See for details.' ++ ); ++ } ++ + customTesters = customTestersOrDiffBuilder; + diffBuilder = diffBuilderOrNothing; + } + + customTesters = customTesters || this.customTesters_; + diffBuilder = diffBuilder || j$.NullDiffBuilder(); + diffBuilder.setRoots(a, b); + + return this.eq_(a, b, [], [], customTesters, diffBuilder); + }; + + // Equality function lovingly adapted from isEqual in + // [Underscore](http://underscorejs.org) + MatchersUtil.prototype.eq_ = function( + a, + b, + aStack, + bStack, + customTesters, + diffBuilder + ) { + var result = true, + self = this, + i; + + var asymmetricResult = this.asymmetricMatch_( + a, + b, + aStack, + bStack, + customTesters, + diffBuilder + ); + if (!j$.util.isUndefined(asymmetricResult)) { + return asymmetricResult; + } + + for (i = 0; i < customTesters.length; i++) { + var customTesterResult = customTesters[i](a, b); + if (!j$.util.isUndefined(customTesterResult)) { + if (!customTesterResult) { + diffBuilder.recordMismatch(); + } + return customTesterResult; + } + } + + if (a instanceof Error && b instanceof Error) { + result = a.message == b.message; + if (!result) { + diffBuilder.recordMismatch(); + } + return result; + } + + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) { + result = a !== 0 || 1 / a == 1 / b; + if (!result) { + diffBuilder.recordMismatch(); + } + return result; + } + // A strict comparison is necessary because `null == undefined`. + if (a === null || b === null) { + result = a === b; + if (!result) { + diffBuilder.recordMismatch(); + } + return result; + } + var className = Object.prototype.toString.call(a); + if (className != Object.prototype.toString.call(b)) { + diffBuilder.recordMismatch(); + return false; + } + switch (className) { + // Strings, numbers, dates, and booleans are compared by value. + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + result = a == String(b); + if (!result) { + diffBuilder.recordMismatch(); + } + return result; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for + // other numeric values. + result = + a != +a ? b != +b : a === 0 && b === 0 ? 1 / a == 1 / b : a == +b; + if (!result) { + diffBuilder.recordMismatch(); + } + return result; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + result = +a == +b; + if (!result) { + diffBuilder.recordMismatch(); + } + return result; + case '[object ArrayBuffer]': + // If we have an instance of ArrayBuffer the Uint8Array ctor + // will be defined as well + return self.eq_( + new Uint8Array(a), // eslint-disable-line compat/compat + new Uint8Array(b), // eslint-disable-line compat/compat + aStack, + bStack, + customTesters, + diffBuilder + ); + // RegExps are compared by their source patterns and flags. + case '[object RegExp]': + return ( + a.source == b.source && + a.global == b.global && + a.multiline == b.multiline && + a.ignoreCase == b.ignoreCase + ); + } + if (typeof a != 'object' || typeof b != 'object') { + diffBuilder.recordMismatch(); + return false; + } + + var aIsDomNode = j$.isDomNode(a); + var bIsDomNode = j$.isDomNode(b); + if (aIsDomNode && bIsDomNode) { + // At first try to use DOM3 method isEqualNode + result = a.isEqualNode(b); + if (!result) { + diffBuilder.recordMismatch(); + } + return result; + } + if (aIsDomNode || bIsDomNode) { + diffBuilder.recordMismatch(); + return false; + } + + var aIsPromise = j$.isPromise(a); + var bIsPromise = j$.isPromise(b); + if (aIsPromise && bIsPromise) { + return a === b; + } + + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] == a) { + return bStack[length] == b; + } + } + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + var size = 0; + // Recursively compare objects and arrays. + // Compare array lengths to determine if a deep comparison is necessary. + if (className == '[object Array]') { + var aLength = a.length; + var bLength = b.length; + + diffBuilder.withPath('length', function() { + if (aLength !== bLength) { + diffBuilder.recordMismatch(); + result = false; + } + }); + + for (i = 0; i < aLength || i < bLength; i++) { + diffBuilder.withPath(i, function() { + if (i >= bLength) { + diffBuilder.recordMismatch( + actualArrayIsLongerFormatter.bind(null, self.pp) + ); + result = false; + } else { + result = + self.eq_( + i < aLength ? a[i] : void 0, + i < bLength ? b[i] : void 0, + aStack, + bStack, + customTesters, + diffBuilder + ) && result; + } + }); + } + if (!result) { + return false; + } + } else if (j$.isMap(a) && j$.isMap(b)) { + if (a.size != b.size) { + diffBuilder.recordMismatch(); + return false; + } + + var keysA = []; + var keysB = []; + a.forEach(function(valueA, keyA) { + keysA.push(keyA); + }); + b.forEach(function(valueB, keyB) { + keysB.push(keyB); + }); + + // For both sets of keys, check they map to equal values in both maps. + // Keep track of corresponding keys (in insertion order) in order to handle asymmetric obj keys. + var mapKeys = [keysA, keysB]; + var cmpKeys = [keysB, keysA]; + var mapIter, mapKey, mapValueA, mapValueB; + var cmpIter, cmpKey; + for (i = 0; result && i < mapKeys.length; i++) { + mapIter = mapKeys[i]; + cmpIter = cmpKeys[i]; + + for (var j = 0; result && j < mapIter.length; j++) { + mapKey = mapIter[j]; + cmpKey = cmpIter[j]; + mapValueA = a.get(mapKey); + + // Only use the cmpKey when one of the keys is asymmetric and the corresponding key matches, + // otherwise explicitly look up the mapKey in the other Map since we want keys with unique + // obj identity (that are otherwise equal) to not match. + if ( + j$.isAsymmetricEqualityTester_(mapKey) || + (j$.isAsymmetricEqualityTester_(cmpKey) && + this.eq_( + mapKey, + cmpKey, + aStack, + bStack, + customTesters, + j$.NullDiffBuilder() + )) + ) { + mapValueB = b.get(cmpKey); + } else { + mapValueB = b.get(mapKey); + } + result = this.eq_( + mapValueA, + mapValueB, + aStack, + bStack, + customTesters, + j$.NullDiffBuilder() + ); + } + } + + if (!result) { + diffBuilder.recordMismatch(); + return false; + } + } else if (j$.isSet(a) && j$.isSet(b)) { + if (a.size != b.size) { + diffBuilder.recordMismatch(); + return false; + } + + var valuesA = []; + a.forEach(function(valueA) { + valuesA.push(valueA); + }); + var valuesB = []; + b.forEach(function(valueB) { + valuesB.push(valueB); + }); + + // For both sets, check they are all contained in the other set + var setPairs = [[valuesA, valuesB], [valuesB, valuesA]]; + var stackPairs = [[aStack, bStack], [bStack, aStack]]; + var baseValues, baseValue, baseStack; + var otherValues, otherValue, otherStack; + var found; + var prevStackSize; + for (i = 0; result && i < setPairs.length; i++) { + baseValues = setPairs[i][0]; + otherValues = setPairs[i][1]; + baseStack = stackPairs[i][0]; + otherStack = stackPairs[i][1]; + // For each value in the base set... + for (var k = 0; result && k < baseValues.length; k++) { + baseValue = baseValues[k]; + found = false; + // ... test that it is present in the other set + for (var l = 0; !found && l < otherValues.length; l++) { + otherValue = otherValues[l]; + prevStackSize = baseStack.length; + // compare by value equality + found = this.eq_( + baseValue, + otherValue, + baseStack, + otherStack, + customTesters, + j$.NullDiffBuilder() + ); + if (!found && prevStackSize !== baseStack.length) { + baseStack.splice(prevStackSize); + otherStack.splice(prevStackSize); + } + } + result = result && found; + } + } + + if (!result) { + diffBuilder.recordMismatch(); + return false; + } + } else if (j$.isURL(a) && j$.isURL(b)) { + // URLs have no enumrable properties, so the default object comparison + // would consider any two URLs to be equal. + return a.toString() === b.toString(); + } else { + // Objects with different constructors are not equivalent, but `Object`s + // or `Array`s from different frames are. + var aCtor = a.constructor, + bCtor = b.constructor; + if ( + aCtor !== bCtor && + isFunction(aCtor) && + isFunction(bCtor) && + a instanceof aCtor && + b instanceof bCtor && + !(aCtor instanceof aCtor && bCtor instanceof bCtor) + ) { + diffBuilder.recordMismatch( + constructorsAreDifferentFormatter.bind(null, this.pp) + ); + return false; + } + } + + // Deep compare objects. + var aKeys = keys(a, className == '[object Array]'), + key; + size = aKeys.length; + + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b, className == '[object Array]').length !== size) { + diffBuilder.recordMismatch( + objectKeysAreDifferentFormatter.bind(null, this.pp) + ); + return false; + } + + for (i = 0; i < size; i++) { + key = aKeys[i]; + // Deep compare each member + if (!j$.util.has(b, key)) { + diffBuilder.recordMismatch( + objectKeysAreDifferentFormatter.bind(null, this.pp) + ); + result = false; + continue; + } + + diffBuilder.withPath(key, function() { + if ( + !self.eq_(a[key], b[key], aStack, bStack, customTesters, diffBuilder) + ) { + result = false; + } + }); + } + + if (!result) { + return false; + } + + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + + return result; + }; + + function keys(obj, isArray) { + var allKeys = Object.keys + ? Object.keys(obj) + : (function(o) { + var keys = []; + for (var key in o) { + if (j$.util.has(o, key)) { + keys.push(key); + } + } + return keys; + })(obj); + + if (!isArray) { + return allKeys; + } + + if (allKeys.length === 0) { + return allKeys; + } + + var extraKeys = []; + for (var i = 0; i < allKeys.length; i++) { + if (!/^[0-9]+$/.test(allKeys[i])) { + extraKeys.push(allKeys[i]); + } + } + + return extraKeys; + } + + function isFunction(obj) { + return typeof obj === 'function'; + } + + function objectKeysAreDifferentFormatter(pp, actual, expected, path) { + var missingProperties = j$.util.objectDifference(expected, actual), + extraProperties = j$.util.objectDifference(actual, expected), + missingPropertiesMessage = formatKeyValuePairs(pp, missingProperties), + extraPropertiesMessage = formatKeyValuePairs(pp, extraProperties), + messages = []; + + if (!path.depth()) { + path = 'object'; + } + + if (missingPropertiesMessage.length) { + messages.push( + 'Expected ' + path + ' to have properties' + missingPropertiesMessage + ); + } + + if (extraPropertiesMessage.length) { + messages.push( + 'Expected ' + path + ' not to have properties' + extraPropertiesMessage + ); + } + + return messages.join('\n'); + } + + function constructorsAreDifferentFormatter(pp, actual, expected, path) { + if (!path.depth()) { + path = 'object'; + } + + return ( + 'Expected ' + + path + + ' to be a kind of ' + + j$.fnNameFor(expected.constructor) + + ', but was ' + + pp(actual) + + '.' + ); + } + + function actualArrayIsLongerFormatter(pp, actual, expected, path) { + return ( + 'Unexpected ' + + path + + (path.depth() ? ' = ' : '') + + pp(actual) + + ' in array.' + ); + } + + function formatKeyValuePairs(pp, obj) { + var formatted = ''; + for (var key in obj) { + formatted += '\n ' + key + ': ' + pp(obj[key]); + } + return formatted; + } + + function isDiffBuilder(obj) { + return obj && typeof obj.recordMismatch === 'function'; + } + + return MatchersUtil; +}; + +/** + * @interface AsymmetricEqualityTester + * @classdesc An asymmetric equality tester is an object that can match multiple + * objects. Examples include jasmine.any() and jasmine.stringMatching(). Jasmine + * includes a number of built-in asymmetric equality testers, such as + * {@link jasmine.objectContaining}. User-defined asymmetric equality testers are + * also supported. + * + * Asymmetric equality testers work with any matcher, including user-defined + * custom matchers, that uses {@link MatchersUtil#equals} or + * {@link MatchersUtil#contains}. + * + * @example + * function numberDivisibleBy(divisor) { + * return { + * asymmetricMatch: function(n) { + * return typeof n === 'number' && n % divisor === 0; + * }, + * jasmineToString: function() { + * return ``; + * } + * }; + * } + * + * var actual = { + * n: 2, + * otherFields: "don't care" + * }; + * + * expect(actual).toEqual(jasmine.objectContaining({n: numberDivisibleBy(2)})); + * @see custom_asymmetric_equality_testers + * @since 2.0.0 + */ +/** + * Determines whether a value matches this tester + * @function + * @name AsymmetricEqualityTester#asymmetricMatch + * @param value {any} The value to test + * @param matchersUtil {MatchersUtil} utilities for testing equality, etc + * @return {Boolean} + */ +/** + * Returns a string representation of this tester to use in matcher failure messages + * @function + * @name AsymmetricEqualityTester#jasmineToString + * @param pp {function} Function that takes a value and returns a pretty-printed representation + * @return {String} + */ + +getJasmineRequireObj().MismatchTree = function(j$) { + /* + To be able to apply custom object formatters at all possible levels of an + object graph, DiffBuilder needs to be able to know not just where the + mismatch occurred but also all ancestors of the mismatched value in both + the expected and actual object graphs. MismatchTree maintains that context + and provides it via the traverse method. + */ + function MismatchTree(path) { + this.path = path || new j$.ObjectPath([]); + this.formatter = undefined; + this.children = []; + this.isMismatch = false; + } + + MismatchTree.prototype.add = function(path, formatter) { + var key, child; + + if (path.depth() === 0) { + this.formatter = formatter; + this.isMismatch = true; + } else { + key = path.components[0]; + path = path.shift(); + child = this.child(key); + + if (!child) { + child = new MismatchTree(this.path.add(key)); + this.children.push(child); + } + + child.add(path, formatter); + } + }; + + MismatchTree.prototype.traverse = function(visit) { + var i, + hasChildren = this.children.length > 0; + + if (this.isMismatch || hasChildren) { + if (visit(this.path, !hasChildren, this.formatter)) { + for (i = 0; i < this.children.length; i++) { + this.children[i].traverse(visit); + } + } + } + }; + + MismatchTree.prototype.child = function(key) { + var i, pathEls; + + for (i = 0; i < this.children.length; i++) { + pathEls = this.children[i].path.components; + if (pathEls[pathEls.length - 1] === key) { + return this.children[i]; + } + } + }; + + return MismatchTree; +}; + +getJasmineRequireObj().nothing = function() { + /** + * {@link expect} nothing explicitly. + * @function + * @name matchers#nothing + * @since 2.8.0 + * @example + * expect().nothing(); + */ + function nothing() { + return { + compare: function() { + return { + pass: true + }; + } + }; + } + + return nothing; +}; + +getJasmineRequireObj().NullDiffBuilder = function(j$) { + return function() { + return { + withPath: function(_, block) { + block(); + }, + setRoots: function() {}, + recordMismatch: function() {} + }; + }; +}; + +getJasmineRequireObj().ObjectPath = function(j$) { + function ObjectPath(components) { + this.components = components || []; + } + + ObjectPath.prototype.toString = function() { + if (this.components.length) { + return '$' + map(this.components, formatPropertyAccess).join(''); + } else { + return ''; + } + }; + + ObjectPath.prototype.add = function(component) { + return new ObjectPath(this.components.concat([component])); + }; + + ObjectPath.prototype.shift = function() { + return new ObjectPath(this.components.slice(1)); + }; + + ObjectPath.prototype.depth = function() { + return this.components.length; + }; + + function formatPropertyAccess(prop) { + if (typeof prop === 'number') { + return '[' + prop + ']'; + } + + if (isValidIdentifier(prop)) { + return '.' + prop; + } + + return "['" + prop + "']"; + } + + function map(array, fn) { + var results = []; + for (var i = 0; i < array.length; i++) { + results.push(fn(array[i])); + } + return results; + } + + function isValidIdentifier(string) { + return /^[A-Za-z\$_][A-Za-z0-9\$_]*$/.test(string); + } + + return ObjectPath; +}; + +getJasmineRequireObj().requireAsyncMatchers = function(jRequire, j$) { + var availableMatchers = [ + 'toBePending', + 'toBeResolved', + 'toBeRejected', + 'toBeResolvedTo', + 'toBeRejectedWith', + 'toBeRejectedWithError' + ], + matchers = {}; + + for (var i = 0; i < availableMatchers.length; i++) { + var name = availableMatchers[i]; + matchers[name] = jRequire[name](j$); + } + + return matchers; +}; + +getJasmineRequireObj().toBe = function(j$) { + /** + * {@link expect} the actual value to be `===` to the expected value. + * @function + * @name matchers#toBe + * @since 1.3.0 + * @param {Object} expected - The expected value to compare against. + * @example + * expect(thing).toBe(realThing); + */ + function toBe(matchersUtil) { + var tip = + ' Tip: To check for deep equality, use .toEqual() instead of .toBe().'; + + return { + compare: function(actual, expected) { + var result = { + pass: actual === expected + }; + + if (typeof expected === 'object') { + result.message = + matchersUtil.buildFailureMessage( + 'toBe', + result.pass, + actual, + expected + ) + tip; + } + + return result; + } + }; + } + + return toBe; +}; + +getJasmineRequireObj().toBeCloseTo = function() { + /** + * {@link expect} the actual value to be within a specified precision of the expected value. + * @function + * @name matchers#toBeCloseTo + * @since 1.3.0 + * @param {Object} expected - The expected value to compare against. + * @param {Number} [precision=2] - The number of decimal points to check. + * @example + * expect(number).toBeCloseTo(42.2, 3); + */ + function toBeCloseTo() { + return { + compare: function(actual, expected, precision) { + if (precision !== 0) { + precision = precision || 2; + } + + if (expected === null || actual === null) { + throw new Error( + 'Cannot use toBeCloseTo with null. Arguments evaluated to: ' + + 'expect(' + + actual + + ').toBeCloseTo(' + + expected + + ').' + ); + } + + var pow = Math.pow(10, precision + 1); + var delta = Math.abs(expected - actual); + var maxDelta = Math.pow(10, -precision) / 2; + + return { + pass: Math.round(delta * pow) <= maxDelta * pow + }; + } + }; + } + + return toBeCloseTo; +}; + +getJasmineRequireObj().toBeDefined = function() { + /** + * {@link expect} the actual value to be defined. (Not `undefined`) + * @function + * @name matchers#toBeDefined + * @since 1.3.0 + * @example + * expect(result).toBeDefined(); + */ + function toBeDefined() { + return { + compare: function(actual) { + return { + pass: void 0 !== actual + }; + } + }; + } + + return toBeDefined; +}; + +getJasmineRequireObj().toBeFalse = function() { + /** + * {@link expect} the actual value to be `false`. + * @function + * @name matchers#toBeFalse + * @since 3.5.0 + * @example + * expect(result).toBeFalse(); + */ + function toBeFalse() { + return { + compare: function(actual) { + return { + pass: actual === false + }; + } + }; + } + + return toBeFalse; +}; + +getJasmineRequireObj().toBeFalsy = function() { + /** + * {@link expect} the actual value to be falsy + * @function + * @name matchers#toBeFalsy + * @since 2.0.0 + * @example + * expect(result).toBeFalsy(); + */ + function toBeFalsy() { + return { + compare: function(actual) { + return { + pass: !actual + }; + } + }; + } + + return toBeFalsy; +}; + +getJasmineRequireObj().toBeGreaterThan = function() { + /** + * {@link expect} the actual value to be greater than the expected value. + * @function + * @name matchers#toBeGreaterThan + * @since 2.0.0 + * @param {Number} expected - The value to compare against. + * @example + * expect(result).toBeGreaterThan(3); + */ + function toBeGreaterThan() { + return { + compare: function(actual, expected) { + return { + pass: actual > expected + }; + } + }; + } + + return toBeGreaterThan; +}; + +getJasmineRequireObj().toBeGreaterThanOrEqual = function() { + /** + * {@link expect} the actual value to be greater than or equal to the expected value. + * @function + * @name matchers#toBeGreaterThanOrEqual + * @since 2.0.0 + * @param {Number} expected - The expected value to compare against. + * @example + * expect(result).toBeGreaterThanOrEqual(25); + */ + function toBeGreaterThanOrEqual() { + return { + compare: function(actual, expected) { + return { + pass: actual >= expected + }; + } + }; + } + + return toBeGreaterThanOrEqual; +}; + +getJasmineRequireObj().toBeInstanceOf = function(j$) { + var usageError = j$.formatErrorMsg( + '', + 'expect(value).toBeInstanceOf()' + ); + + /** + * {@link expect} the actual to be an instance of the expected class + * @function + * @name matchers#toBeInstanceOf + * @since 3.5.0 + * @param {Object} expected - The class or constructor function to check for + * @example + * expect('foo').toBeInstanceOf(String); + * expect(3).toBeInstanceOf(Number); + * expect(new Error()).toBeInstanceOf(Error); + */ + function toBeInstanceOf(matchersUtil) { + return { + compare: function(actual, expected) { + var actualType = + actual && actual.constructor + ? j$.fnNameFor(actual.constructor) + : matchersUtil.pp(actual), + expectedType = expected + ? j$.fnNameFor(expected) + : matchersUtil.pp(expected), + expectedMatcher, + pass; + + try { + expectedMatcher = new j$.Any(expected); + pass = expectedMatcher.asymmetricMatch(actual); + } catch (error) { + throw new Error( + usageError('Expected value is not a constructor function') + ); + } + + if (pass) { + return { + pass: true, + message: + 'Expected instance of ' + + actualType + + ' not to be an instance of ' + + expectedType + }; + } else { + return { + pass: false, + message: + 'Expected instance of ' + + actualType + + ' to be an instance of ' + + expectedType + }; + } + } + }; + } + + return toBeInstanceOf; +}; + +getJasmineRequireObj().toBeLessThan = function() { + /** + * {@link expect} the actual value to be less than the expected value. + * @function + * @name matchers#toBeLessThan + * @since 2.0.0 + * @param {Number} expected - The expected value to compare against. + * @example + * expect(result).toBeLessThan(0); + */ + function toBeLessThan() { + return { + compare: function(actual, expected) { + return { + pass: actual < expected + }; + } + }; + } + + return toBeLessThan; +}; + +getJasmineRequireObj().toBeLessThanOrEqual = function() { + /** + * {@link expect} the actual value to be less than or equal to the expected value. + * @function + * @name matchers#toBeLessThanOrEqual + * @since 2.0.0 + * @param {Number} expected - The expected value to compare against. + * @example + * expect(result).toBeLessThanOrEqual(123); + */ + function toBeLessThanOrEqual() { + return { + compare: function(actual, expected) { + return { + pass: actual <= expected + }; + } + }; + } + + return toBeLessThanOrEqual; +}; + +getJasmineRequireObj().toBeNaN = function(j$) { + /** + * {@link expect} the actual value to be `NaN` (Not a Number). + * @function + * @name matchers#toBeNaN + * @since 1.3.0 + * @example + * expect(thing).toBeNaN(); + */ + function toBeNaN(matchersUtil) { + return { + compare: function(actual) { + var result = { + pass: actual !== actual + }; + + if (result.pass) { + result.message = 'Expected actual not to be NaN.'; + } else { + result.message = function() { + return 'Expected ' + matchersUtil.pp(actual) + ' to be NaN.'; + }; + } + + return result; + } + }; + } + + return toBeNaN; +}; + +getJasmineRequireObj().toBeNegativeInfinity = function(j$) { + /** + * {@link expect} the actual value to be `-Infinity` (-infinity). + * @function + * @name matchers#toBeNegativeInfinity + * @since 2.6.0 + * @example + * expect(thing).toBeNegativeInfinity(); + */ + function toBeNegativeInfinity(matchersUtil) { + return { + compare: function(actual) { + var result = { + pass: actual === Number.NEGATIVE_INFINITY + }; + + if (result.pass) { + result.message = 'Expected actual not to be -Infinity.'; + } else { + result.message = function() { + return 'Expected ' + matchersUtil.pp(actual) + ' to be -Infinity.'; + }; + } + + return result; + } + }; + } + + return toBeNegativeInfinity; +}; + +getJasmineRequireObj().toBeNull = function() { + /** + * {@link expect} the actual value to be `null`. + * @function + * @name matchers#toBeNull + * @since 1.3.0 + * @example + * expect(result).toBeNull(); + */ + function toBeNull() { + return { + compare: function(actual) { + return { + pass: actual === null + }; + } + }; + } + + return toBeNull; +}; + +getJasmineRequireObj().toBePositiveInfinity = function(j$) { + /** + * {@link expect} the actual value to be `Infinity` (infinity). + * @function + * @name matchers#toBePositiveInfinity + * @since 2.6.0 + * @example + * expect(thing).toBePositiveInfinity(); + */ + function toBePositiveInfinity(matchersUtil) { + return { + compare: function(actual) { + var result = { + pass: actual === Number.POSITIVE_INFINITY + }; + + if (result.pass) { + result.message = 'Expected actual not to be Infinity.'; + } else { + result.message = function() { + return 'Expected ' + matchersUtil.pp(actual) + ' to be Infinity.'; + }; + } + + return result; + } + }; + } + + return toBePositiveInfinity; +}; + +getJasmineRequireObj().toBeTrue = function() { + /** + * {@link expect} the actual value to be `true`. + * @function + * @name matchers#toBeTrue + * @since 3.5.0 + * @example + * expect(result).toBeTrue(); + */ + function toBeTrue() { + return { + compare: function(actual) { + return { + pass: actual === true + }; + } + }; + } + + return toBeTrue; +}; + +getJasmineRequireObj().toBeTruthy = function() { + /** + * {@link expect} the actual value to be truthy. + * @function + * @name matchers#toBeTruthy + * @since 2.0.0 + * @example + * expect(thing).toBeTruthy(); + */ + function toBeTruthy() { + return { + compare: function(actual) { + return { + pass: !!actual + }; + } + }; + } + + return toBeTruthy; +}; + +getJasmineRequireObj().toBeUndefined = function() { + /** + * {@link expect} the actual value to be `undefined`. + * @function + * @name matchers#toBeUndefined + * @since 1.3.0 + * @example + * expect(result).toBeUndefined(): + */ + function toBeUndefined() { + return { + compare: function(actual) { + return { + pass: void 0 === actual + }; + } + }; + } + + return toBeUndefined; +}; + +getJasmineRequireObj().toContain = function() { + /** + * {@link expect} the actual value to contain a specific value. + * @function + * @name matchers#toContain + * @since 2.0.0 + * @param {Object} expected - The value to look for. + * @example + * expect(array).toContain(anElement); + * expect(string).toContain(substring); + */ + function toContain(matchersUtil) { + return { + compare: function(actual, expected) { + return { + pass: matchersUtil.contains(actual, expected) + }; + } + }; + } + + return toContain; +}; + +getJasmineRequireObj().toEqual = function(j$) { + /** + * {@link expect} the actual value to be equal to the expected, using deep equality comparison. + * @function + * @name matchers#toEqual + * @since 1.3.0 + * @param {Object} expected - Expected value + * @example + * expect(bigObject).toEqual({"foo": ['bar', 'baz']}); + */ + function toEqual(matchersUtil) { + return { + compare: function(actual, expected) { + var result = { + pass: false + }, + diffBuilder = j$.DiffBuilder({ prettyPrinter: matchersUtil.pp }); + + result.pass = matchersUtil.equals(actual, expected, diffBuilder); + + // TODO: only set error message if test fails + result.message = diffBuilder.getMessage(); + + return result; + } + }; + } + + return toEqual; +}; + +getJasmineRequireObj().toHaveBeenCalled = function(j$) { + var getErrorMsg = j$.formatErrorMsg( + '', + 'expect().toHaveBeenCalled()' + ); + + /** + * {@link expect} the actual (a {@link Spy}) to have been called. + * @function + * @name matchers#toHaveBeenCalled + * @since 1.3.0 + * @example + * expect(mySpy).toHaveBeenCalled(); + * expect(mySpy).not.toHaveBeenCalled(); + */ + function toHaveBeenCalled(matchersUtil) { + return { + compare: function(actual) { + var result = {}; + + if (!j$.isSpy(actual)) { + throw new Error( + getErrorMsg( + 'Expected a spy, but got ' + matchersUtil.pp(actual) + '.' + ) + ); + } + + if (arguments.length > 1) { + throw new Error( + getErrorMsg('Does not take arguments, use toHaveBeenCalledWith') + ); + } + + result.pass = actual.calls.any(); + + result.message = result.pass + ? 'Expected spy ' + actual.and.identity + ' not to have been called.' + : 'Expected spy ' + actual.and.identity + ' to have been called.'; + + return result; + } + }; + } + + return toHaveBeenCalled; +}; + +getJasmineRequireObj().toHaveBeenCalledBefore = function(j$) { + var getErrorMsg = j$.formatErrorMsg( + '', + 'expect().toHaveBeenCalledBefore()' + ); + + /** + * {@link expect} the actual value (a {@link Spy}) to have been called before another {@link Spy}. + * @function + * @name matchers#toHaveBeenCalledBefore + * @since 2.6.0 + * @param {Spy} expected - {@link Spy} that should have been called after the `actual` {@link Spy}. + * @example + * expect(mySpy).toHaveBeenCalledBefore(otherSpy); + */ + function toHaveBeenCalledBefore(matchersUtil) { + return { + compare: function(firstSpy, latterSpy) { + if (!j$.isSpy(firstSpy)) { + throw new Error( + getErrorMsg( + 'Expected a spy, but got ' + matchersUtil.pp(firstSpy) + '.' + ) + ); + } + if (!j$.isSpy(latterSpy)) { + throw new Error( + getErrorMsg( + 'Expected a spy, but got ' + matchersUtil.pp(latterSpy) + '.' + ) + ); + } + + var result = { pass: false }; + + if (!firstSpy.calls.count()) { + result.message = + 'Expected spy ' + firstSpy.and.identity + ' to have been called.'; + return result; + } + if (!latterSpy.calls.count()) { + result.message = + 'Expected spy ' + latterSpy.and.identity + ' to have been called.'; + return result; + } + + var latest1stSpyCall = firstSpy.calls.mostRecent().invocationOrder; + var first2ndSpyCall = latterSpy.calls.first().invocationOrder; + + result.pass = latest1stSpyCall < first2ndSpyCall; + + if (result.pass) { + result.message = + 'Expected spy ' + + firstSpy.and.identity + + ' to not have been called before spy ' + + latterSpy.and.identity + + ', but it was'; + } else { + var first1stSpyCall = firstSpy.calls.first().invocationOrder; + var latest2ndSpyCall = latterSpy.calls.mostRecent().invocationOrder; + + if (first1stSpyCall < first2ndSpyCall) { + result.message = + 'Expected latest call to spy ' + + firstSpy.and.identity + + ' to have been called before first call to spy ' + + latterSpy.and.identity + + ' (no interleaved calls)'; + } else if (latest2ndSpyCall > latest1stSpyCall) { + result.message = + 'Expected first call to spy ' + + latterSpy.and.identity + + ' to have been called after latest call to spy ' + + firstSpy.and.identity + + ' (no interleaved calls)'; + } else { + result.message = + 'Expected spy ' + + firstSpy.and.identity + + ' to have been called before spy ' + + latterSpy.and.identity; + } + } + + return result; + } + }; + } + + return toHaveBeenCalledBefore; +}; + +getJasmineRequireObj().toHaveBeenCalledOnceWith = function(j$) { + var getErrorMsg = j$.formatErrorMsg( + '', + 'expect().toHaveBeenCalledOnceWith(...arguments)' + ); + + /** + * {@link expect} the actual (a {@link Spy}) to have been called exactly once, and exactly with the particular arguments. + * @function + * @name matchers#toHaveBeenCalledOnceWith + * @since 3.6.0 + * @param {...Object} - The arguments to look for + * @example + * expect(mySpy).toHaveBeenCalledOnceWith('foo', 'bar', 2); + */ + function toHaveBeenCalledOnceWith(util) { + return { + compare: function() { + var args = Array.prototype.slice.call(arguments, 0), + actual = args[0], + expectedArgs = args.slice(1); + + if (!j$.isSpy(actual)) { + throw new Error( + getErrorMsg('Expected a spy, but got ' + util.pp(actual) + '.') + ); + } + + var prettyPrintedCalls = actual.calls + .allArgs() + .map(function(argsForCall) { + return ' ' + util.pp(argsForCall); + }); + + if ( + actual.calls.count() === 1 && + util.contains(actual.calls.allArgs(), expectedArgs) + ) { + return { + pass: true, + message: + 'Expected spy ' + + actual.and.identity + + ' to have been called 0 times, multiple times, or once, but with arguments different from:\n' + + ' ' + + util.pp(expectedArgs) + + '\n' + + 'But the actual call was:\n' + + prettyPrintedCalls.join(',\n') + + '.\n\n' + }; + } + + function getDiffs() { + return actual.calls.allArgs().map(function(argsForCall, callIx) { + var diffBuilder = new j$.DiffBuilder(); + util.equals(argsForCall, expectedArgs, diffBuilder); + return diffBuilder.getMessage(); + }); + } + + function butString() { + switch (actual.calls.count()) { + case 0: + return 'But it was never called.\n\n'; + case 1: + return ( + 'But the actual call was:\n' + + prettyPrintedCalls.join(',\n') + + '.\n' + + getDiffs().join('\n') + + '\n\n' + ); + default: + return ( + 'But the actual calls were:\n' + + prettyPrintedCalls.join(',\n') + + '.\n\n' + ); + } + } + + return { + pass: false, + message: + 'Expected spy ' + + actual.and.identity + + ' to have been called only once, and with given args:\n' + + ' ' + + util.pp(expectedArgs) + + '\n' + + butString() + }; + } + }; + } + + return toHaveBeenCalledOnceWith; +}; + +getJasmineRequireObj().toHaveBeenCalledTimes = function(j$) { + var getErrorMsg = j$.formatErrorMsg( + '', + 'expect().toHaveBeenCalledTimes()' + ); + + /** + * {@link expect} the actual (a {@link Spy}) to have been called the specified number of times. + * @function + * @name matchers#toHaveBeenCalledTimes + * @since 2.4.0 + * @param {Number} expected - The number of invocations to look for. + * @example + * expect(mySpy).toHaveBeenCalledTimes(3); + */ + function toHaveBeenCalledTimes(matchersUtil) { + return { + compare: function(actual, expected) { + if (!j$.isSpy(actual)) { + throw new Error( + getErrorMsg( + 'Expected a spy, but got ' + matchersUtil.pp(actual) + '.' + ) + ); + } + + var args = Array.prototype.slice.call(arguments, 0), + result = { pass: false }; + + if (!j$.isNumber_(expected)) { + throw new Error( + getErrorMsg( + 'The expected times failed is a required argument and must be a number.' + ) + ); + } + + actual = args[0]; + var calls = actual.calls.count(); + var timesMessage = expected === 1 ? 'once' : expected + ' times'; + result.pass = calls === expected; + result.message = result.pass + ? 'Expected spy ' + + actual.and.identity + + ' not to have been called ' + + timesMessage + + '. It was called ' + + calls + + ' times.' + : 'Expected spy ' + + actual.and.identity + + ' to have been called ' + + timesMessage + + '. It was called ' + + calls + + ' times.'; + return result; + } + }; + } + + return toHaveBeenCalledTimes; +}; + +getJasmineRequireObj().toHaveBeenCalledWith = function(j$) { + var getErrorMsg = j$.formatErrorMsg( + '', + 'expect().toHaveBeenCalledWith(...arguments)' + ); + + /** + * {@link expect} the actual (a {@link Spy}) to have been called with particular arguments at least once. + * @function + * @name matchers#toHaveBeenCalledWith + * @since 1.3.0 + * @param {...Object} - The arguments to look for + * @example + * expect(mySpy).toHaveBeenCalledWith('foo', 'bar', 2); + */ + function toHaveBeenCalledWith(matchersUtil) { + return { + compare: function() { + var args = Array.prototype.slice.call(arguments, 0), + actual = args[0], + expectedArgs = args.slice(1), + result = { pass: false }; + + if (!j$.isSpy(actual)) { + throw new Error( + getErrorMsg( + 'Expected a spy, but got ' + matchersUtil.pp(actual) + '.' + ) + ); + } + + if (!actual.calls.any()) { + result.message = function() { + return ( + 'Expected spy ' + + actual.and.identity + + ' to have been called with:\n' + + ' ' + + matchersUtil.pp(expectedArgs) + + '\nbut it was never called.' + ); + }; + return result; + } + + if (matchersUtil.contains(actual.calls.allArgs(), expectedArgs)) { + result.pass = true; + result.message = function() { + return ( + 'Expected spy ' + + actual.and.identity + + ' not to have been called with:\n' + + ' ' + + matchersUtil.pp(expectedArgs) + + '\nbut it was.' + ); + }; + } else { + result.message = function() { + var prettyPrintedCalls = actual.calls + .allArgs() + .map(function(argsForCall) { + return ' ' + matchersUtil.pp(argsForCall); + }); + + var diffs = actual.calls + .allArgs() + .map(function(argsForCall, callIx) { + var diffBuilder = new j$.DiffBuilder(); + matchersUtil.equals(argsForCall, expectedArgs, diffBuilder); + return ( + 'Call ' + + callIx + + ':\n' + + diffBuilder.getMessage().replace(/^/gm, ' ') + ); + }); + + return ( + 'Expected spy ' + + actual.and.identity + + ' to have been called with:\n' + + ' ' + + matchersUtil.pp(expectedArgs) + + '\n' + + '' + + 'but actual calls were:\n' + + prettyPrintedCalls.join(',\n') + + '.\n\n' + + diffs.join('\n') + ); + }; + } + + return result; + } + }; + } + + return toHaveBeenCalledWith; +}; + +getJasmineRequireObj().toHaveClass = function(j$) { + /** + * {@link expect} the actual value to be a DOM element that has the expected class + * @function + * @name matchers#toHaveClass + * @since 3.0.0 + * @param {Object} expected - The class name to test for + * @example + * var el = document.createElement('div'); + * el.className = 'foo bar baz'; + * expect(el).toHaveClass('bar'); + */ + function toHaveClass(matchersUtil) { + return { + compare: function(actual, expected) { + if (!isElement(actual)) { + throw new Error(matchersUtil.pp(actual) + ' is not a DOM element'); + } + + return { + pass: actual.classList.contains(expected) + }; + } + }; + } + + function isElement(maybeEl) { + return ( + maybeEl && maybeEl.classList && j$.isFunction_(maybeEl.classList.contains) + ); + } + + return toHaveClass; +}; + +getJasmineRequireObj().toHaveSize = function(j$) { + /** + * {@link expect} the actual size to be equal to the expected, using array-like length or object keys size. + * @function + * @name matchers#toHaveSize + * @since 3.6.0 + * @param {Object} expected - Expected size + * @example + * array = [1,2]; + * expect(array).toHaveSize(2); + */ + function toHaveSize() { + return { + compare: function(actual, expected) { + var result = { + pass: false + }; + + if ( + j$.isA_('WeakSet', actual) || + j$.isWeakMap(actual) || + j$.isDataView(actual) + ) { + throw new Error('Cannot get size of ' + actual + '.'); + } + + if (j$.isSet(actual) || j$.isMap(actual)) { + result.pass = actual.size === expected; + } else if (isLength(actual.length)) { + result.pass = actual.length === expected; + } else { + result.pass = Object.keys(actual).length === expected; + } + + return result; + } + }; + } + + var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; // eslint-disable-line compat/compat + function isLength(value) { + return ( + typeof value == 'number' && + value > -1 && + value % 1 === 0 && + value <= MAX_SAFE_INTEGER + ); + } + + return toHaveSize; +}; + +getJasmineRequireObj().toMatch = function(j$) { + var getErrorMsg = j$.formatErrorMsg( + '', + 'expect().toMatch( || )' + ); + + /** + * {@link expect} the actual value to match a regular expression + * @function + * @name matchers#toMatch + * @since 1.3.0 + * @param {RegExp|String} expected - Value to look for in the string. + * @example + * expect("my string").toMatch(/string$/); + * expect("other string").toMatch("her"); + */ + function toMatch() { + return { + compare: function(actual, expected) { + if (!j$.isString_(expected) && !j$.isA_('RegExp', expected)) { + throw new Error(getErrorMsg('Expected is not a String or a RegExp')); + } + + var regexp = new RegExp(expected); + + return { + pass: regexp.test(actual) + }; + } + }; + } + + return toMatch; +}; + +getJasmineRequireObj().toThrow = function(j$) { + var getErrorMsg = j$.formatErrorMsg( + '', + 'expect(function() {}).toThrow()' + ); + + /** + * {@link expect} a function to `throw` something. + * @function + * @name matchers#toThrow + * @since 2.0.0 + * @param {Object} [expected] - Value that should be thrown. If not provided, simply the fact that something was thrown will be checked. + * @example + * expect(function() { return 'things'; }).toThrow('foo'); + * expect(function() { return 'stuff'; }).toThrow(); + */ + function toThrow(matchersUtil) { + return { + compare: function(actual, expected) { + var result = { pass: false }, + threw = false, + thrown; + + if (typeof actual != 'function') { + throw new Error(getErrorMsg('Actual is not a Function')); + } + + try { + actual(); + } catch (e) { + threw = true; + thrown = e; + } + + if (!threw) { + result.message = 'Expected function to throw an exception.'; + return result; + } + + if (arguments.length == 1) { + result.pass = true; + result.message = function() { + return ( + 'Expected function not to throw, but it threw ' + + matchersUtil.pp(thrown) + + '.' + ); + }; + + return result; + } + + if (matchersUtil.equals(thrown, expected)) { + result.pass = true; + result.message = function() { + return ( + 'Expected function not to throw ' + + matchersUtil.pp(expected) + + '.' + ); + }; + } else { + result.message = function() { + return ( + 'Expected function to throw ' + + matchersUtil.pp(expected) + + ', but it threw ' + + matchersUtil.pp(thrown) + + '.' + ); + }; + } + + return result; + } + }; + } + + return toThrow; +}; + +getJasmineRequireObj().toThrowError = function(j$) { + var getErrorMsg = j$.formatErrorMsg( + '', + 'expect(function() {}).toThrowError(, )' + ); + + /** + * {@link expect} a function to `throw` an `Error`. + * @function + * @name matchers#toThrowError + * @since 2.0.0 + * @param {Error} [expected] - `Error` constructor the object that was thrown needs to be an instance of. If not provided, `Error` will be used. + * @param {RegExp|String} [message] - The message that should be set on the thrown `Error` + * @example + * expect(function() { return 'things'; }).toThrowError(MyCustomError, 'message'); + * expect(function() { return 'things'; }).toThrowError(MyCustomError, /bar/); + * expect(function() { return 'stuff'; }).toThrowError(MyCustomError); + * expect(function() { return 'other'; }).toThrowError(/foo/); + * expect(function() { return 'other'; }).toThrowError(); + */ + function toThrowError(matchersUtil) { + return { + compare: function(actual) { + var errorMatcher = getMatcher.apply(null, arguments), + thrown; + + if (typeof actual != 'function') { + throw new Error(getErrorMsg('Actual is not a Function')); + } + + try { + actual(); + return fail('Expected function to throw an Error.'); + } catch (e) { + thrown = e; + } + + if (!j$.isError_(thrown)) { + return fail(function() { + return ( + 'Expected function to throw an Error, but it threw ' + + matchersUtil.pp(thrown) + + '.' + ); + }); + } + + return errorMatcher.match(thrown); + } + }; + + function getMatcher() { + var expected, errorType; + + if (arguments[2]) { + errorType = arguments[1]; + expected = arguments[2]; + if (!isAnErrorType(errorType)) { + throw new Error(getErrorMsg('Expected error type is not an Error.')); + } + + return exactMatcher(expected, errorType); + } else if (arguments[1]) { + expected = arguments[1]; + + if (isAnErrorType(arguments[1])) { + return exactMatcher(null, arguments[1]); + } else { + return exactMatcher(arguments[1], null); + } + } else { + return anyMatcher(); + } + } + + function anyMatcher() { + return { + match: function(error) { + return pass( + 'Expected function not to throw an Error, but it threw ' + + j$.fnNameFor(error) + + '.' + ); + } + }; + } + + function exactMatcher(expected, errorType) { + if (expected && !isStringOrRegExp(expected)) { + if (errorType) { + throw new Error( + getErrorMsg('Expected error message is not a string or RegExp.') + ); + } else { + throw new Error( + getErrorMsg('Expected is not an Error, string, or RegExp.') + ); + } + } + + function messageMatch(message) { + if (typeof expected == 'string') { + return expected == message; + } else { + return expected.test(message); + } + } + + var errorTypeDescription = errorType + ? j$.fnNameFor(errorType) + : 'an exception'; + + function thrownDescription(thrown) { + var thrownName = errorType + ? j$.fnNameFor(thrown.constructor) + : 'an exception', + thrownMessage = ''; + + if (expected) { + thrownMessage = ' with message ' + matchersUtil.pp(thrown.message); + } + + return thrownName + thrownMessage; + } + + function messageDescription() { + if (expected === null) { + return ''; + } else if (expected instanceof RegExp) { + return ' with a message matching ' + matchersUtil.pp(expected); + } else { + return ' with message ' + matchersUtil.pp(expected); + } + } + + function matches(error) { + return ( + (errorType === null || error instanceof errorType) && + (expected === null || messageMatch(error.message)) + ); + } + + return { + match: function(thrown) { + if (matches(thrown)) { + return pass(function() { + return ( + 'Expected function not to throw ' + + errorTypeDescription + + messageDescription() + + '.' + ); + }); + } else { + return fail(function() { + return ( + 'Expected function to throw ' + + errorTypeDescription + + messageDescription() + + ', but it threw ' + + thrownDescription(thrown) + + '.' + ); + }); + } + } + }; + } + + function isStringOrRegExp(potential) { + return potential instanceof RegExp || typeof potential == 'string'; + } + + function isAnErrorType(type) { + if (typeof type !== 'function') { + return false; + } + + var Surrogate = function() {}; + Surrogate.prototype = type.prototype; + return j$.isError_(new Surrogate()); + } + } + + function pass(message) { + return { + pass: true, + message: message + }; + } + + function fail(message) { + return { + pass: false, + message: message + }; + } + + return toThrowError; +}; + +getJasmineRequireObj().toThrowMatching = function(j$) { + var usageError = j$.formatErrorMsg( + '', + 'expect(function() {}).toThrowMatching()' + ); + + /** + * {@link expect} a function to `throw` something matching a predicate. + * @function + * @name matchers#toThrowMatching + * @since 3.0.0 + * @param {Function} predicate - A function that takes the thrown exception as its parameter and returns true if it matches. + * @example + * expect(function() { throw new Error('nope'); }).toThrowMatching(function(thrown) { return thrown.message === 'nope'; }); + */ + function toThrowMatching(matchersUtil) { + return { + compare: function(actual, predicate) { + var thrown; + + if (typeof actual !== 'function') { + throw new Error(usageError('Actual is not a Function')); + } + + if (typeof predicate !== 'function') { + throw new Error(usageError('Predicate is not a Function')); + } + + try { + actual(); + return fail('Expected function to throw an exception.'); + } catch (e) { + thrown = e; + } + + if (predicate(thrown)) { + return pass( + 'Expected function not to throw an exception matching a predicate.' + ); + } else { + return fail(function() { + return ( + 'Expected function to throw an exception matching a predicate, ' + + 'but it threw ' + + thrownDescription(thrown) + + '.' + ); + }); + } + } + }; + + function thrownDescription(thrown) { + if (thrown && thrown.constructor) { + return ( + j$.fnNameFor(thrown.constructor) + + ' with message ' + + matchersUtil.pp(thrown.message) + ); + } else { + return matchersUtil.pp(thrown); + } + } + } + + function pass(message) { + return { + pass: true, + message: message + }; + } + + function fail(message) { + return { + pass: false, + message: message + }; + } + + return toThrowMatching; +}; + - getJasmineRequireObj().MockDate = function() { ++getJasmineRequireObj().MockDate = function(j$) { + function MockDate(global) { + var self = this; + var currentTime = 0; + + if (!global || !global.Date) { + self.install = function() {}; + self.tick = function() {}; + self.uninstall = function() {}; + return self; + } + + var GlobalDate = global.Date; + + self.install = function(mockDate) { + if (mockDate instanceof GlobalDate) { + currentTime = mockDate.getTime(); + } else { ++ if (!j$.util.isUndefined(mockDate)) { ++ j$.getEnv().deprecated( ++ 'The argument to jasmine.clock().mockDate(), if specified, ' + ++ 'should be a Date instance. Passing anything other than a Date ' + ++ 'will be treated as an error in a future release.' ++ ); ++ } ++ + currentTime = new GlobalDate().getTime(); + } + + global.Date = FakeDate; + }; + + self.tick = function(millis) { + millis = millis || 0; + currentTime = currentTime + millis; + }; + + self.uninstall = function() { + currentTime = 0; + global.Date = GlobalDate; + }; + + createDateProperties(); + + return self; + + function FakeDate() { + switch (arguments.length) { + case 0: + return new GlobalDate(currentTime); + case 1: + return new GlobalDate(arguments[0]); + case 2: + return new GlobalDate(arguments[0], arguments[1]); + case 3: + return new GlobalDate(arguments[0], arguments[1], arguments[2]); + case 4: + return new GlobalDate( + arguments[0], + arguments[1], + arguments[2], + arguments[3] + ); + case 5: + return new GlobalDate( + arguments[0], + arguments[1], + arguments[2], + arguments[3], + arguments[4] + ); + case 6: + return new GlobalDate( + arguments[0], + arguments[1], + arguments[2], + arguments[3], + arguments[4], + arguments[5] + ); + default: + return new GlobalDate( + arguments[0], + arguments[1], + arguments[2], + arguments[3], + arguments[4], + arguments[5], + arguments[6] + ); + } + } + + function createDateProperties() { + FakeDate.prototype = GlobalDate.prototype; + + FakeDate.now = function() { + if (GlobalDate.now) { + return currentTime; + } else { + throw new Error('Browser does not support Date.now()'); + } + }; + + FakeDate.toSource = GlobalDate.toSource; + FakeDate.toString = GlobalDate.toString; + FakeDate.parse = GlobalDate.parse; + FakeDate.UTC = GlobalDate.UTC; + } + } + + return MockDate; +}; + +getJasmineRequireObj().makePrettyPrinter = function(j$) { + function SinglePrettyPrintRun(customObjectFormatters, pp) { + this.customObjectFormatters_ = customObjectFormatters; + this.ppNestLevel_ = 0; + this.seen = []; + this.length = 0; + this.stringParts = []; + this.pp_ = pp; + } + + function hasCustomToString(value) { + // value.toString !== Object.prototype.toString if value has no custom toString but is from another context (e.g. + // iframe, web worker) + try { + return ( + j$.isFunction_(value.toString) && + value.toString !== Object.prototype.toString && + value.toString() !== Object.prototype.toString.call(value) + ); + } catch (e) { + // The custom toString() threw. + return true; + } + } + + SinglePrettyPrintRun.prototype.format = function(value) { + this.ppNestLevel_++; + try { + var customFormatResult = this.applyCustomFormatters_(value); + + if (customFormatResult) { + this.emitScalar(customFormatResult); + } else if (j$.util.isUndefined(value)) { + this.emitScalar('undefined'); + } else if (value === null) { + this.emitScalar('null'); + } else if (value === 0 && 1 / value === -Infinity) { + this.emitScalar('-0'); + } else if (value === j$.getGlobal()) { + this.emitScalar(''); + } else if (value.jasmineToString) { + this.emitScalar(value.jasmineToString(this.pp_)); + } else if (typeof value === 'string') { + this.emitString(value); + } else if (j$.isSpy(value)) { + this.emitScalar('spy on ' + value.and.identity); + } else if (j$.isSpy(value.toString)) { + this.emitScalar('spy on ' + value.toString.and.identity); + } else if (value instanceof RegExp) { + this.emitScalar(value.toString()); + } else if (typeof value === 'function') { + this.emitScalar('Function'); + } else if (j$.isDomNode(value)) { + if (value.tagName) { + this.emitDomElement(value); + } else { + this.emitScalar('HTMLNode'); + } + } else if (value instanceof Date) { + this.emitScalar('Date(' + value + ')'); + } else if (j$.isSet(value)) { + this.emitSet(value); + } else if (j$.isMap(value)) { + this.emitMap(value); + } else if (j$.isTypedArray_(value)) { + this.emitTypedArray(value); + } else if ( + value.toString && + typeof value === 'object' && + !j$.isArray_(value) && + hasCustomToString(value) + ) { + try { + this.emitScalar(value.toString()); + } catch (e) { + this.emitScalar('has-invalid-toString-method'); + } + } else if (j$.util.arrayContains(this.seen, value)) { + this.emitScalar( + '' + ); + } else if (j$.isArray_(value) || j$.isA_('Object', value)) { + this.seen.push(value); + if (j$.isArray_(value)) { + this.emitArray(value); + } else { + this.emitObject(value); + } + this.seen.pop(); + } else { + this.emitScalar(value.toString()); + } + } catch (e) { + if (this.ppNestLevel_ > 1 || !(e instanceof MaxCharsReachedError)) { + throw e; + } + } finally { + this.ppNestLevel_--; + } + }; + + SinglePrettyPrintRun.prototype.applyCustomFormatters_ = function(value) { + return customFormat(value, this.customObjectFormatters_); + }; + + SinglePrettyPrintRun.prototype.iterateObject = function(obj, fn) { + var objKeys = keys(obj, j$.isArray_(obj)); + var isGetter = function isGetter(prop) {}; + + if (obj.__lookupGetter__) { + isGetter = function isGetter(prop) { + var getter = obj.__lookupGetter__(prop); + return !j$.util.isUndefined(getter) && getter !== null; + }; + } + var length = Math.min(objKeys.length, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH); + for (var i = 0; i < length; i++) { + var property = objKeys[i]; + fn(property, isGetter(property)); + } + + return objKeys.length > length; + }; + + SinglePrettyPrintRun.prototype.emitScalar = function(value) { + this.append(value); + }; + + SinglePrettyPrintRun.prototype.emitString = function(value) { + this.append("'" + value + "'"); + }; + + SinglePrettyPrintRun.prototype.emitArray = function(array) { + if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { + this.append('Array'); + return; + } + var length = Math.min(array.length, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH); + this.append('[ '); + for (var i = 0; i < length; i++) { + if (i > 0) { + this.append(', '); + } + this.format(array[i]); + } + if (array.length > length) { + this.append(', ...'); + } + + var self = this; + var first = array.length === 0; + var truncated = this.iterateObject(array, function(property, isGetter) { + if (first) { + first = false; + } else { + self.append(', '); + } + + self.formatProperty(array, property, isGetter); + }); + + if (truncated) { + this.append(', ...'); + } + + this.append(' ]'); + }; + + SinglePrettyPrintRun.prototype.emitSet = function(set) { + if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { + this.append('Set'); + return; + } + this.append('Set( '); + var size = Math.min(set.size, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH); + var i = 0; + set.forEach(function(value, key) { + if (i >= size) { + return; + } + if (i > 0) { + this.append(', '); + } + this.format(value); + + i++; + }, this); + if (set.size > size) { + this.append(', ...'); + } + this.append(' )'); + }; + + SinglePrettyPrintRun.prototype.emitMap = function(map) { + if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { + this.append('Map'); + return; + } + this.append('Map( '); + var size = Math.min(map.size, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH); + var i = 0; + map.forEach(function(value, key) { + if (i >= size) { + return; + } + if (i > 0) { + this.append(', '); + } + this.format([key, value]); + + i++; + }, this); + if (map.size > size) { + this.append(', ...'); + } + this.append(' )'); + }; + + SinglePrettyPrintRun.prototype.emitObject = function(obj) { + var ctor = obj.constructor, + constructorName; + + constructorName = + typeof ctor === 'function' && obj instanceof ctor + ? j$.fnNameFor(obj.constructor) + : 'null'; + + this.append(constructorName); + + if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { + return; + } + + var self = this; + this.append('({ '); + var first = true; + + var truncated = this.iterateObject(obj, function(property, isGetter) { + if (first) { + first = false; + } else { + self.append(', '); + } + + self.formatProperty(obj, property, isGetter); + }); + + if (truncated) { + this.append(', ...'); + } + + this.append(' })'); + }; + + SinglePrettyPrintRun.prototype.emitTypedArray = function(arr) { + var constructorName = j$.fnNameFor(arr.constructor), + limitedArray = Array.prototype.slice.call( + arr, + 0, + j$.MAX_PRETTY_PRINT_ARRAY_LENGTH + ), + itemsString = Array.prototype.join.call(limitedArray, ', '); + + if (limitedArray.length !== arr.length) { + itemsString += ', ...'; + } + + this.append(constructorName + ' [ ' + itemsString + ' ]'); + }; + + SinglePrettyPrintRun.prototype.emitDomElement = function(el) { + var tagName = el.tagName.toLowerCase(), + attrs = el.attributes, + i, + len = attrs.length, + out = '<' + tagName, + attr; + + for (i = 0; i < len; i++) { + attr = attrs[i]; + out += ' ' + attr.name; + + if (attr.value !== '') { + out += '="' + attr.value + '"'; + } + } + + out += '>'; + + if (el.childElementCount !== 0 || el.textContent !== '') { + out += '...'; + } + + this.append(out); + }; + + SinglePrettyPrintRun.prototype.formatProperty = function( + obj, + property, + isGetter + ) { + this.append(property); + this.append(': '); + if (isGetter) { + this.append(''); + } else { + this.format(obj[property]); + } + }; + + SinglePrettyPrintRun.prototype.append = function(value) { + // This check protects us from the rare case where an object has overriden + // `toString()` with an invalid implementation (returning a non-string). + if (typeof value !== 'string') { + value = Object.prototype.toString.call(value); + } + + var result = truncate(value, j$.MAX_PRETTY_PRINT_CHARS - this.length); + this.length += result.value.length; + this.stringParts.push(result.value); + + if (result.truncated) { + throw new MaxCharsReachedError(); + } + }; + + function truncate(s, maxlen) { + if (s.length <= maxlen) { + return { value: s, truncated: false }; + } + + s = s.substring(0, maxlen - 4) + ' ...'; + return { value: s, truncated: true }; + } + + function MaxCharsReachedError() { + this.message = + 'Exceeded ' + + j$.MAX_PRETTY_PRINT_CHARS + + ' characters while pretty-printing a value'; + } + + MaxCharsReachedError.prototype = new Error(); + + function keys(obj, isArray) { + var allKeys = Object.keys + ? Object.keys(obj) + : (function(o) { + var keys = []; + for (var key in o) { + if (j$.util.has(o, key)) { + keys.push(key); + } + } + return keys; + })(obj); + + if (!isArray) { + return allKeys; + } + + if (allKeys.length === 0) { + return allKeys; + } + + var extraKeys = []; + for (var i = 0; i < allKeys.length; i++) { + if (!/^[0-9]+$/.test(allKeys[i])) { + extraKeys.push(allKeys[i]); + } + } + + return extraKeys; + } + + function customFormat(value, customObjectFormatters) { + var i, result; + + for (i = 0; i < customObjectFormatters.length; i++) { + result = customObjectFormatters[i](value); + + if (result !== undefined) { + return result; + } + } + } + + return function(customObjectFormatters) { + customObjectFormatters = customObjectFormatters || []; + + var pp = function(value) { + var prettyPrinter = new SinglePrettyPrintRun(customObjectFormatters, pp); + prettyPrinter.format(value); + return prettyPrinter.stringParts.join(''); + }; + + pp.customFormat_ = function(value) { + return customFormat(value, customObjectFormatters); + }; + + return pp; + }; +}; + +getJasmineRequireObj().QueueRunner = function(j$) { + var nextid = 1; + + function StopExecutionError() {} + StopExecutionError.prototype = new Error(); + j$.StopExecutionError = StopExecutionError; + - function once(fn) { ++ function once(fn, onTwice) { + var called = false; + return function(arg) { - if (!called) { ++ if (called) { ++ if (onTwice) { ++ onTwice(); ++ } ++ } else { + called = true; + // Direct call using single parameter, because cleanup/next does not need more + fn(arg); + } + return null; + }; + } + ++ function fallbackOnMultipleDone() { ++ console.error( ++ new Error( ++ "An asynchronous function called its 'done' " + ++ 'callback more than once, in a QueueRunner without a onMultipleDone ' + ++ 'handler.' ++ ) ++ ); ++ } ++ + function emptyFn() {} + + function QueueRunner(attrs) { + this.id_ = nextid++; + var queueableFns = attrs.queueableFns || []; + this.queueableFns = queueableFns.concat(attrs.cleanupFns || []); + this.firstCleanupIx = queueableFns.length; + this.onComplete = attrs.onComplete || emptyFn; + this.clearStack = + attrs.clearStack || + function(fn) { + fn(); + }; + this.onException = attrs.onException || emptyFn; ++ this.onMultipleDone = attrs.onMultipleDone || fallbackOnMultipleDone; + this.userContext = attrs.userContext || new j$.UserContext(); + this.timeout = attrs.timeout || { + setTimeout: setTimeout, + clearTimeout: clearTimeout + }; + this.fail = attrs.fail || emptyFn; + this.globalErrors = attrs.globalErrors || { + pushListener: emptyFn, + popListener: emptyFn + }; + this.completeOnFirstError = !!attrs.completeOnFirstError; + this.errored = false; + + if (typeof this.onComplete !== 'function') { + throw new Error('invalid onComplete ' + JSON.stringify(this.onComplete)); + } + this.deprecated = attrs.deprecated; + } + + QueueRunner.prototype.execute = function() { + var self = this; + this.handleFinalError = function(message, source, lineno, colno, error) { + // Older browsers would send the error as the first parameter. HTML5 + // specifies the the five parameters above. The error instance should + // be preffered, otherwise the call stack would get lost. + self.onException(error || message); + }; + this.globalErrors.pushListener(this.handleFinalError); + this.run(0); + }; + + QueueRunner.prototype.skipToCleanup = function(lastRanIndex) { + if (lastRanIndex < this.firstCleanupIx) { + this.run(this.firstCleanupIx); + } else { + this.run(lastRanIndex + 1); + } + }; + + QueueRunner.prototype.clearTimeout = function(timeoutId) { + Function.prototype.apply.apply(this.timeout.clearTimeout, [ + j$.getGlobal(), + [timeoutId] + ]); + }; + + QueueRunner.prototype.setTimeout = function(fn, timeout) { + return Function.prototype.apply.apply(this.timeout.setTimeout, [ + j$.getGlobal(), + [fn, timeout] + ]); + }; + + QueueRunner.prototype.attempt = function attempt(iterativeIndex) { + var self = this, + completedSynchronously = true, + handleError = function handleError(error) { ++ // TODO probably shouldn't next() right away here. ++ // That makes debugging async failures much more confusing. + onException(error); + }, + cleanup = once(function cleanup() { + if (timeoutId !== void 0) { + self.clearTimeout(timeoutId); + } + self.globalErrors.popListener(handleError); + }), - next = once(function next(err) { - cleanup(); ++ next = once( ++ function next(err) { ++ cleanup(); + - if (j$.isError_(err)) { - if (!(err instanceof StopExecutionError) && !err.jasmineMessage) { - self.fail(err); ++ if (j$.isError_(err)) { ++ if (!(err instanceof StopExecutionError) && !err.jasmineMessage) { ++ self.fail(err); ++ } ++ self.errored = errored = true; ++ } else if (typeof err !== 'undefined' && !self.errored) { ++ self.deprecated( ++ 'Any argument passed to a done callback will be treated as an ' + ++ 'error in a future release. Call the done callback without ' + ++ "arguments if you don't want to trigger a spec failure." ++ ); + } - self.errored = errored = true; - } + - function runNext() { - if (self.completeOnFirstError && errored) { - self.skipToCleanup(iterativeIndex); - } else { - self.run(iterativeIndex + 1); ++ function runNext() { ++ if (self.completeOnFirstError && errored) { ++ self.skipToCleanup(iterativeIndex); ++ } else { ++ self.run(iterativeIndex + 1); ++ } + } - } + - if (completedSynchronously) { - self.setTimeout(runNext); - } else { - runNext(); ++ if (completedSynchronously) { ++ self.setTimeout(runNext); ++ } else { ++ runNext(); ++ } ++ }, ++ function() { ++ try { ++ if (!timedOut) { ++ self.onMultipleDone(); ++ } ++ } catch (error) { ++ // Any error we catch here is probably due to a bug in Jasmine, ++ // and it's not likely to end up anywhere useful if we let it ++ // propagate. Log it so it can at least show up when debugging. ++ console.error(error); ++ } + } - }), ++ ), + errored = false, ++ timedOut = false, + queueableFn = self.queueableFns[iterativeIndex], + timeoutId, + maybeThenable; + + next.fail = function nextFail() { + self.fail.apply(null, arguments); + self.errored = errored = true; + next(); + }; + + self.globalErrors.pushListener(handleError); + + if (queueableFn.timeout !== undefined) { + var timeoutInterval = queueableFn.timeout || j$.DEFAULT_TIMEOUT_INTERVAL; + timeoutId = self.setTimeout(function() { ++ timedOut = true; + var error = new Error( + 'Timeout - Async function did not complete within ' + + timeoutInterval + + 'ms ' + + (queueableFn.timeout + ? '(custom timeout)' + : '(set by jasmine.DEFAULT_TIMEOUT_INTERVAL)') + ); ++ // TODO Need to decide what to do about a successful completion after a ++ // timeout. That should probably not be a deprecation, and maybe not ++ // an error in 4.0. (But a diagnostic of some sort might be helpful.) + onException(error); + next(); + }, timeoutInterval); + } + + try { + if (queueableFn.fn.length === 0) { + maybeThenable = queueableFn.fn.call(self.userContext); + + if (maybeThenable && j$.isFunction_(maybeThenable.then)) { - maybeThenable.then(next, onPromiseRejection); ++ maybeThenable.then( ++ wrapInPromiseResolutionHandler(next), ++ onPromiseRejection ++ ); + completedSynchronously = false; + return { completedSynchronously: false }; + } + } else { + maybeThenable = queueableFn.fn.call(self.userContext, next); + this.diagnoseConflictingAsync_(queueableFn.fn, maybeThenable); + completedSynchronously = false; + return { completedSynchronously: false }; + } + } catch (e) { + onException(e); + self.errored = errored = true; + } + + cleanup(); + return { completedSynchronously: true, errored: errored }; + + function onException(e) { + self.onException(e); + self.errored = errored = true; + } + + function onPromiseRejection(e) { + onException(e); + next(); + } + }; + + QueueRunner.prototype.run = function(recursiveIndex) { + var length = this.queueableFns.length, + self = this, + iterativeIndex; + + for ( + iterativeIndex = recursiveIndex; + iterativeIndex < length; + iterativeIndex++ + ) { + var result = this.attempt(iterativeIndex); + + if (!result.completedSynchronously) { + return; + } + + self.errored = self.errored || result.errored; + + if (this.completeOnFirstError && result.errored) { + this.skipToCleanup(iterativeIndex); + return; + } + } + + this.clearStack(function() { + self.globalErrors.popListener(self.handleFinalError); - self.onComplete(self.errored && new StopExecutionError()); ++ ++ if (self.errored) { ++ self.onComplete(new StopExecutionError()); ++ } else { ++ self.onComplete(); ++ } + }); + }; + + QueueRunner.prototype.diagnoseConflictingAsync_ = function(fn, retval) { ++ var msg; ++ + if (retval && j$.isFunction_(retval.then)) { - // Issue a warning that matches the user's code ++ // Issue a warning that matches the user's code. ++ // Omit the stack trace because there's almost certainly no user code ++ // on the stack at this point. + if (j$.isAsyncFunction_(fn)) { - this.deprecated( ++ msg = + 'An asynchronous before/it/after ' + - 'function was defined with the async keyword but also took a ' + - 'done callback. This is not supported and will stop working in' + - ' the future. Either remove the done callback (recommended) or ' + - 'remove the async keyword.' - ); ++ 'function was defined with the async keyword but also took a ' + ++ 'done callback. This is not supported and will stop working in' + ++ ' the future. Either remove the done callback (recommended) or ' + ++ 'remove the async keyword.'; + } else { - this.deprecated( ++ msg = + 'An asynchronous before/it/after ' + - 'function took a done callback but also returned a promise. ' + - 'This is not supported and will stop working in the future. ' + - 'Either remove the done callback (recommended) or change the ' + - 'function to not return a promise.' - ); ++ 'function took a done callback but also returned a promise. ' + ++ 'This is not supported and will stop working in the future. ' + ++ 'Either remove the done callback (recommended) or change the ' + ++ 'function to not return a promise.'; + } ++ ++ this.deprecated(msg, { omitStackTrace: true }); + } + }; + ++ function wrapInPromiseResolutionHandler(fn) { ++ return function(maybeArg) { ++ if (j$.isError_(maybeArg)) { ++ fn(maybeArg); ++ } else { ++ fn(); ++ } ++ }; ++ } ++ + return QueueRunner; +}; + +getJasmineRequireObj().ReportDispatcher = function(j$) { - function ReportDispatcher(methods, queueRunnerFactory) { ++ function ReportDispatcher(methods, queueRunnerFactory, deprecated) { + var dispatchedMethods = methods || []; + + for (var i = 0; i < dispatchedMethods.length; i++) { + var method = dispatchedMethods[i]; + this[method] = (function(m) { + return function() { + dispatch(m, arguments); + }; + })(method); + } + + var reporters = []; + var fallbackReporter = null; + + this.addReporter = function(reporter) { + reporters.push(reporter); + }; + + this.provideFallbackReporter = function(reporter) { + fallbackReporter = reporter; + }; + + this.clearReporters = function() { + reporters = []; + }; + + return this; + + function dispatch(method, args) { + if (reporters.length === 0 && fallbackReporter !== null) { + reporters.push(fallbackReporter); + } + var onComplete = args[args.length - 1]; + args = j$.util.argsToArray(args).splice(0, args.length - 1); + var fns = []; + for (var i = 0; i < reporters.length; i++) { + var reporter = reporters[i]; + addFn(fns, reporter, method, args); + } + + queueRunnerFactory({ + queueableFns: fns, + onComplete: onComplete, - isReporter: true ++ isReporter: true, ++ onMultipleDone: function() { ++ deprecated( ++ "An asynchronous reporter callback called its 'done' callback " + ++ 'more than once. This is a bug in the reporter callback in ' + ++ 'question. This will be treated as an error in a future ' + ++ 'version. See' + ++ ' ' + ++ 'for more information.', ++ { ignoreRunnable: true } ++ ); ++ } + }); + } + + function addFn(fns, reporter, method, args) { + var fn = reporter[method]; + if (!fn) { + return; + } + + var thisArgs = j$.util.cloneArgs(args); + if (fn.length <= 1) { + fns.push({ + fn: function() { + return fn.apply(reporter, thisArgs); + } + }); + } else { + fns.push({ + fn: function(done) { + return fn.apply(reporter, thisArgs.concat([done])); + } + }); + } + } + } + + return ReportDispatcher; +}; + +getJasmineRequireObj().interface = function(jasmine, env) { + var jasmineInterface = { + /** + * Callback passed to parts of the Jasmine base interface. + * + * By default Jasmine assumes this function completes synchronously. + * If you have code that you need to test asynchronously, you can declare that you receive a `done` callback, return a Promise, or use the `async` keyword if it is supported in your environment. + * @callback implementationCallback + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + */ + + /** + * Create a group of specs (often called a suite). + * + * Calls to `describe` can be nested within other calls to compose your suite as a tree. + * @name describe + * @since 1.3.0 + * @function + * @global + * @param {String} description Textual description of the group + * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites and specs + */ + describe: function(description, specDefinitions) { + return env.describe(description, specDefinitions); + }, + + /** + * A temporarily disabled [`describe`]{@link describe} + * + * Specs within an `xdescribe` will be marked pending and not executed + * @name xdescribe + * @since 1.3.0 + * @function + * @global + * @param {String} description Textual description of the group + * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites and specs + */ + xdescribe: function(description, specDefinitions) { + return env.xdescribe(description, specDefinitions); + }, + + /** + * A focused [`describe`]{@link describe} + * + * If suites or specs are focused, only those that are focused will be executed + * @see fit + * @name fdescribe + * @since 2.1.0 + * @function + * @global + * @param {String} description Textual description of the group + * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites and specs + */ + fdescribe: function(description, specDefinitions) { + return env.fdescribe(description, specDefinitions); + }, + + /** + * Define a single spec. A spec should contain one or more {@link expect|expectations} that test the state of the code. + * + * A spec whose expectations all succeed will be passing and a spec with any failures will fail. + * The name `it` is a pronoun for the test target, not an abbreviation of anything. It makes the + * spec more readable by connecting the function name `it` and the argument `description` as a + * complete sentence. + * @name it + * @since 1.3.0 + * @function + * @global + * @param {String} description Textual description of what this spec is checking + * @param {implementationCallback} [testFunction] Function that contains the code of your test. If not provided the test will be `pending`. + * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec. + * @see async + */ + it: function() { + return env.it.apply(env, arguments); + }, + + /** + * A temporarily disabled [`it`]{@link it} + * + * The spec will report as `pending` and will not be executed. + * @name xit + * @since 1.3.0 + * @function + * @global + * @param {String} description Textual description of what this spec is checking. + * @param {implementationCallback} [testFunction] Function that contains the code of your test. Will not be executed. + */ + xit: function() { + return env.xit.apply(env, arguments); + }, + + /** + * A focused [`it`]{@link it} + * + * If suites or specs are focused, only those that are focused will be executed. + * @name fit + * @since 2.1.0 + * @function + * @global + * @param {String} description Textual description of what this spec is checking. + * @param {implementationCallback} testFunction Function that contains the code of your test. + * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec. + * @see async + */ + fit: function() { + return env.fit.apply(env, arguments); + }, + + /** + * Run some shared setup before each of the specs in the {@link describe} in which it is called. + * @name beforeEach + * @since 1.3.0 + * @function + * @global + * @param {implementationCallback} [function] Function that contains the code to setup your specs. + * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeEach. + * @see async + */ + beforeEach: function() { + return env.beforeEach.apply(env, arguments); + }, + + /** + * Run some shared teardown after each of the specs in the {@link describe} in which it is called. + * @name afterEach + * @since 1.3.0 + * @function + * @global + * @param {implementationCallback} [function] Function that contains the code to teardown your specs. + * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterEach. + * @see async + */ + afterEach: function() { + return env.afterEach.apply(env, arguments); + }, + + /** + * Run some shared setup once before all of the specs in the {@link describe} are run. + * + * _Note:_ Be careful, sharing the setup from a beforeAll makes it easy to accidentally leak state between your specs so that they erroneously pass or fail. + * @name beforeAll + * @since 2.1.0 + * @function + * @global + * @param {implementationCallback} [function] Function that contains the code to setup your specs. + * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeAll. + * @see async + */ + beforeAll: function() { + return env.beforeAll.apply(env, arguments); + }, + + /** + * Run some shared teardown once after all of the specs in the {@link describe} are run. + * + * _Note:_ Be careful, sharing the teardown from a afterAll makes it easy to accidentally leak state between your specs so that they erroneously pass or fail. + * @name afterAll + * @since 2.1.0 + * @function + * @global + * @param {implementationCallback} [function] Function that contains the code to teardown your specs. + * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterAll. + * @see async + */ + afterAll: function() { + return env.afterAll.apply(env, arguments); + }, + + /** + * Sets a user-defined property that will be provided to reporters as part of the properties field of {@link SpecResult} + * @name setSpecProperty + * @since 3.6.0 + * @function + * @param {String} key The name of the property + * @param {*} value The value of the property + */ + setSpecProperty: function(key, value) { + return env.setSpecProperty(key, value); + }, + + /** + * Sets a user-defined property that will be provided to reporters as part of the properties field of {@link SuiteResult} + * @name setSuiteProperty + * @since 3.6.0 + * @function + * @param {String} key The name of the property + * @param {*} value The value of the property + */ + setSuiteProperty: function(key, value) { + return env.setSuiteProperty(key, value); + }, + + /** + * Create an expectation for a spec. + * @name expect + * @since 1.3.0 + * @function + * @global + * @param {Object} actual - Actual computed value to test expectations against. + * @return {matchers} + */ + expect: function(actual) { + return env.expect(actual); + }, + + /** + * Create an asynchronous expectation for a spec. Note that the matchers + * that are provided by an asynchronous expectation all return promises + * which must be either returned from the spec or waited for using `await` + * in order for Jasmine to associate them with the correct spec. + * @name expectAsync + * @since 3.3.0 + * @function + * @global + * @param {Object} actual - Actual computed value to test expectations against. + * @return {async-matchers} + * @example + * await expectAsync(somePromise).toBeResolved(); + * @example + * return expectAsync(somePromise).toBeResolved(); + */ + expectAsync: function(actual) { + return env.expectAsync(actual); + }, + + /** + * Mark a spec as pending, expectation results will be ignored. + * @name pending + * @since 2.0.0 + * @function + * @global + * @param {String} [message] - Reason the spec is pending. + */ + pending: function() { + return env.pending.apply(env, arguments); + }, + + /** + * Explicitly mark a spec as failed. + * @name fail + * @since 2.1.0 + * @function + * @global + * @param {String|Error} [error] - Reason for the failure. + */ + fail: function() { + return env.fail.apply(env, arguments); + }, + + /** + * Install a spy onto an existing object. + * @name spyOn + * @since 1.3.0 + * @function + * @global + * @param {Object} obj - The object upon which to install the {@link Spy}. + * @param {String} methodName - The name of the method to replace with a {@link Spy}. + * @returns {Spy} + */ + spyOn: function(obj, methodName) { + return env.spyOn(obj, methodName); + }, + + /** + * Install a spy on a property installed with `Object.defineProperty` onto an existing object. + * @name spyOnProperty + * @since 2.6.0 + * @function + * @global + * @param {Object} obj - The object upon which to install the {@link Spy} + * @param {String} propertyName - The name of the property to replace with a {@link Spy}. + * @param {String} [accessType=get] - The access type (get|set) of the property to {@link Spy} on. + * @returns {Spy} + */ + spyOnProperty: function(obj, methodName, accessType) { + return env.spyOnProperty(obj, methodName, accessType); + }, + + /** + * Installs spies on all writable and configurable properties of an object. + * @name spyOnAllFunctions + * @since 3.2.1 + * @function + * @global + * @param {Object} obj - The object upon which to install the {@link Spy}s + * @param {boolean} includeNonEnumerable - Whether or not to add spies to non-enumerable properties + * @returns {Object} the spied object + */ + spyOnAllFunctions: function(obj, includeNonEnumerable) { + return env.spyOnAllFunctions(obj, includeNonEnumerable); + }, + + jsApiReporter: new jasmine.JsApiReporter({ + timer: new jasmine.Timer() + }), + + /** + * @namespace jasmine + */ + jasmine: jasmine + }; + + /** + * Add a custom equality tester for the current scope of specs. + * + * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}. + * @name jasmine.addCustomEqualityTester + * @since 2.0.0 + * @function + * @param {Function} tester - A function which takes two arguments to compare and returns a `true` or `false` comparison result if it knows how to compare them, and `undefined` otherwise. + * @see custom_equality + */ + jasmine.addCustomEqualityTester = function(tester) { + env.addCustomEqualityTester(tester); + }; + + /** + * Add custom matchers for the current scope of specs. + * + * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}. + * @name jasmine.addMatchers + * @since 2.0.0 + * @function + * @param {Object} matchers - Keys from this object will be the new matcher names. + * @see custom_matcher + */ + jasmine.addMatchers = function(matchers) { + return env.addMatchers(matchers); + }; + + /** + * Add custom async matchers for the current scope of specs. + * + * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}. + * @name jasmine.addAsyncMatchers + * @since 3.5.0 + * @function + * @param {Object} matchers - Keys from this object will be the new async matcher names. + * @see custom_matcher + */ + jasmine.addAsyncMatchers = function(matchers) { + return env.addAsyncMatchers(matchers); + }; + + /** + * Add a custom object formatter for the current scope of specs. + * + * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}. + * @name jasmine.addCustomObjectFormatter + * @since 3.6.0 + * @function + * @param {Function} formatter - A function which takes a value to format and returns a string if it knows how to format it, and `undefined` otherwise. + * @see custom_object_formatters + */ + jasmine.addCustomObjectFormatter = function(formatter) { + return env.addCustomObjectFormatter(formatter); + }; + + /** + * Get the currently booted mock {Clock} for this Jasmine environment. + * @name jasmine.clock + * @since 2.0.0 + * @function + * @returns {Clock} + */ + jasmine.clock = function() { + return env.clock; + }; + + /** + * Create a bare {@link Spy} object. This won't be installed anywhere and will not have any implementation behind it. + * @name jasmine.createSpy + * @since 1.3.0 + * @function + * @param {String} [name] - Name to give the spy. This will be displayed in failure messages. + * @param {Function} [originalFn] - Function to act as the real implementation. + * @return {Spy} + */ + jasmine.createSpy = function(name, originalFn) { + return env.createSpy(name, originalFn); + }; + + /** + * Create an object with multiple {@link Spy}s as its members. + * @name jasmine.createSpyObj + * @since 1.3.0 + * @function + * @param {String} [baseName] - Base name for the spies in the object. + * @param {String[]|Object} methodNames - Array of method names to create spies for, or Object whose keys will be method names and values the {@link Spy#and#returnValue|returnValue}. + * @param {String[]|Object} [propertyNames] - Array of property names to create spies for, or Object whose keys will be propertynames and values the {@link Spy#and#returnValue|returnValue}. + * @return {Object} + */ + jasmine.createSpyObj = function(baseName, methodNames, propertyNames) { + return env.createSpyObj(baseName, methodNames, propertyNames); + }; + + /** + * Add a custom spy strategy for the current scope of specs. + * + * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}. + * @name jasmine.addSpyStrategy + * @since 3.5.0 + * @function + * @param {String} name - The name of the strategy (i.e. what you call from `and`) + * @param {Function} factory - Factory function that returns the plan to be executed. + */ + jasmine.addSpyStrategy = function(name, factory) { + return env.addSpyStrategy(name, factory); + }; + + /** + * Set the default spy strategy for the current scope of specs. + * + * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}. + * @name jasmine.setDefaultSpyStrategy + * @function + * @param {Function} defaultStrategyFn - a function that assigns a strategy + * @example + * beforeEach(function() { + * jasmine.setDefaultSpyStrategy(and => and.returnValue(true)); + * }); + */ + jasmine.setDefaultSpyStrategy = function(defaultStrategyFn) { + return env.setDefaultSpyStrategy(defaultStrategyFn); + }; + + return jasmineInterface; +}; + +getJasmineRequireObj().Spy = function(j$) { + var nextOrder = (function() { + var order = 0; + + return function() { + return order++; + }; + })(); + + var matchersUtil = new j$.MatchersUtil({ + customTesters: [], + pp: j$.makePrettyPrinter() + }); + + /** + * @classdesc _Note:_ Do not construct this directly. Use {@link spyOn}, + * {@link spyOnProperty}, {@link jasmine.createSpy}, or + * {@link jasmine.createSpyObj} instead. + * @class Spy + * @hideconstructor + */ + function Spy( + name, + originalFn, + customStrategies, + defaultStrategyFn, + getPromise + ) { + var numArgs = typeof originalFn === 'function' ? originalFn.length : 0, + wrapper = makeFunc(numArgs, function(context, args, invokeNew) { + return spy(context, args, invokeNew); + }), + strategyDispatcher = new SpyStrategyDispatcher({ + name: name, + fn: originalFn, + getSpy: function() { + return wrapper; + }, + customStrategies: customStrategies, + getPromise: getPromise + }), + callTracker = new j$.CallTracker(), + spy = function(context, args, invokeNew) { + /** + * @name Spy.callData + * @property {object} object - `this` context for the invocation. + * @property {number} invocationOrder - Order of the invocation. + * @property {Array} args - The arguments passed for this invocation. + * @property returnValue - The value that was returned from this invocation. + */ + var callData = { + object: context, + invocationOrder: nextOrder(), + args: Array.prototype.slice.apply(args) + }; + + callTracker.track(callData); + var returnValue = strategyDispatcher.exec(context, args, invokeNew); + callData.returnValue = returnValue; + + return returnValue; + }; + + function makeFunc(length, fn) { + switch (length) { + case 1: + return function wrap1(a) { + return fn(this, arguments, this instanceof wrap1); + }; + case 2: + return function wrap2(a, b) { + return fn(this, arguments, this instanceof wrap2); + }; + case 3: + return function wrap3(a, b, c) { + return fn(this, arguments, this instanceof wrap3); + }; + case 4: + return function wrap4(a, b, c, d) { + return fn(this, arguments, this instanceof wrap4); + }; + case 5: + return function wrap5(a, b, c, d, e) { + return fn(this, arguments, this instanceof wrap5); + }; + case 6: + return function wrap6(a, b, c, d, e, f) { + return fn(this, arguments, this instanceof wrap6); + }; + case 7: + return function wrap7(a, b, c, d, e, f, g) { + return fn(this, arguments, this instanceof wrap7); + }; + case 8: + return function wrap8(a, b, c, d, e, f, g, h) { + return fn(this, arguments, this instanceof wrap8); + }; + case 9: + return function wrap9(a, b, c, d, e, f, g, h, i) { + return fn(this, arguments, this instanceof wrap9); + }; + default: + return function wrap() { + return fn(this, arguments, this instanceof wrap); + }; + } + } + + for (var prop in originalFn) { + if (prop === 'and' || prop === 'calls') { + throw new Error( + "Jasmine spies would overwrite the 'and' and 'calls' properties on the object being spied upon" + ); + } + + wrapper[prop] = originalFn[prop]; + } + + /** + * @member {SpyStrategy} - Accesses the default strategy for the spy. This strategy will be used + * whenever the spy is called with arguments that don't match any strategy + * created with {@link Spy#withArgs}. + * @name Spy#and + * @since 2.0.0 + * @example + * spyOn(someObj, 'func').and.returnValue(42); + */ + wrapper.and = strategyDispatcher.and; + /** + * Specifies a strategy to be used for calls to the spy that have the + * specified arguments. + * @name Spy#withArgs + * @since 3.0.0 + * @function + * @param {...*} args - The arguments to match + * @type {SpyStrategy} + * @example + * spyOn(someObj, 'func').withArgs(1, 2, 3).and.returnValue(42); + * someObj.func(1, 2, 3); // returns 42 + */ + wrapper.withArgs = function() { + return strategyDispatcher.withArgs.apply(strategyDispatcher, arguments); + }; + wrapper.calls = callTracker; + + if (defaultStrategyFn) { + defaultStrategyFn(wrapper.and); + } + + return wrapper; + } + + function SpyStrategyDispatcher(strategyArgs) { + var baseStrategy = new j$.SpyStrategy(strategyArgs); + var argsStrategies = new StrategyDict(function() { + return new j$.SpyStrategy(strategyArgs); + }); + + this.and = baseStrategy; + + this.exec = function(spy, args, invokeNew) { + var strategy = argsStrategies.get(args); + + if (!strategy) { + if (argsStrategies.any() && !baseStrategy.isConfigured()) { + throw new Error( + "Spy '" + + strategyArgs.name + + "' received a call with arguments " + - j$.pp(Array.prototype.slice.call(args)) + ++ j$.basicPrettyPrinter_(Array.prototype.slice.call(args)) + + ' but all configured strategies specify other arguments.' + ); + } else { + strategy = baseStrategy; + } + } + + return strategy.exec(spy, args, invokeNew); + }; + + this.withArgs = function() { + return { and: argsStrategies.getOrCreate(arguments) }; + }; + } + + function StrategyDict(strategyFactory) { + this.strategies = []; + this.strategyFactory = strategyFactory; + } + + StrategyDict.prototype.any = function() { + return this.strategies.length > 0; + }; + + StrategyDict.prototype.getOrCreate = function(args) { + var strategy = this.get(args); + + if (!strategy) { + strategy = this.strategyFactory(); + this.strategies.push({ + args: args, + strategy: strategy + }); + } + + return strategy; + }; + + StrategyDict.prototype.get = function(args) { + var i; + + for (i = 0; i < this.strategies.length; i++) { + if (matchersUtil.equals(args, this.strategies[i].args)) { + return this.strategies[i].strategy; + } + } + }; + + return Spy; +}; + +getJasmineRequireObj().SpyFactory = function(j$) { + function SpyFactory(getCustomStrategies, getDefaultStrategyFn, getPromise) { + var self = this; + + this.createSpy = function(name, originalFn) { + return j$.Spy( + name, + originalFn, + getCustomStrategies(), + getDefaultStrategyFn(), + getPromise + ); + }; + + this.createSpyObj = function(baseName, methodNames, propertyNames) { + var baseNameIsCollection = + j$.isObject_(baseName) || j$.isArray_(baseName); + + if (baseNameIsCollection) { + propertyNames = methodNames; + methodNames = baseName; + baseName = 'unknown'; + } + + var obj = {}; + var spy, descriptor; + + var methods = normalizeKeyValues(methodNames); + for (var i = 0; i < methods.length; i++) { + spy = obj[methods[i][0]] = self.createSpy( + baseName + '.' + methods[i][0] + ); + if (methods[i].length > 1) { + spy.and.returnValue(methods[i][1]); + } + } + + var properties = normalizeKeyValues(propertyNames); + for (var i = 0; i < properties.length; i++) { + descriptor = { + enumerable: true, + get: self.createSpy(baseName + '.' + properties[i][0] + '.get'), + set: self.createSpy(baseName + '.' + properties[i][0] + '.set') + }; + if (properties[i].length > 1) { + descriptor.get.and.returnValue(properties[i][1]); + descriptor.set.and.returnValue(properties[i][1]); + } + Object.defineProperty(obj, properties[i][0], descriptor); + } + + if (methods.length === 0 && properties.length === 0) { + throw 'createSpyObj requires a non-empty array or object of method names to create spies for'; + } + + return obj; + }; + } + + function normalizeKeyValues(object) { + var result = []; + if (j$.isArray_(object)) { + for (var i = 0; i < object.length; i++) { + result.push([object[i]]); + } + } else if (j$.isObject_(object)) { + for (var key in object) { + if (object.hasOwnProperty(key)) { + result.push([key, object[key]]); + } + } + } + return result; + } + + return SpyFactory; +}; + +getJasmineRequireObj().SpyRegistry = function(j$) { + var spyOnMsg = j$.formatErrorMsg('', 'spyOn(, )'); + var spyOnPropertyMsg = j$.formatErrorMsg( + '', + 'spyOnProperty(, , [accessType])' + ); + + function SpyRegistry(options) { + options = options || {}; + var global = options.global || j$.getGlobal(); + var createSpy = options.createSpy; + var currentSpies = + options.currentSpies || + function() { + return []; + }; + + this.allowRespy = function(allow) { + this.respy = allow; + }; + + this.spyOn = function(obj, methodName) { + var getErrorMsg = spyOnMsg; + + if (j$.util.isUndefined(obj) || obj === null) { + throw new Error( + getErrorMsg( + 'could not find an object to spy upon for ' + methodName + '()' + ) + ); + } + + if (j$.util.isUndefined(methodName) || methodName === null) { + throw new Error(getErrorMsg('No method name supplied')); + } + + if (j$.util.isUndefined(obj[methodName])) { + throw new Error(getErrorMsg(methodName + '() method does not exist')); + } + + if (obj[methodName] && j$.isSpy(obj[methodName])) { + if (this.respy) { + return obj[methodName]; + } else { + throw new Error( + getErrorMsg(methodName + ' has already been spied upon') + ); + } + } + + var descriptor = Object.getOwnPropertyDescriptor(obj, methodName); + + if (descriptor && !(descriptor.writable || descriptor.set)) { + throw new Error( + getErrorMsg(methodName + ' is not declared writable or has no setter') + ); + } + + var originalMethod = obj[methodName], + spiedMethod = createSpy(methodName, originalMethod), + restoreStrategy; + + if ( + Object.prototype.hasOwnProperty.call(obj, methodName) || + (obj === global && methodName === 'onerror') + ) { + restoreStrategy = function() { + obj[methodName] = originalMethod; + }; + } else { + restoreStrategy = function() { + if (!delete obj[methodName]) { + obj[methodName] = originalMethod; + } + }; + } + + currentSpies().push({ + restoreObjectToOriginalState: restoreStrategy + }); + + obj[methodName] = spiedMethod; + + return spiedMethod; + }; + + this.spyOnProperty = function(obj, propertyName, accessType) { + var getErrorMsg = spyOnPropertyMsg; + + accessType = accessType || 'get'; + + if (j$.util.isUndefined(obj)) { + throw new Error( + getErrorMsg( + 'spyOn could not find an object to spy upon for ' + + propertyName + + '' + ) + ); + } + + if (j$.util.isUndefined(propertyName)) { + throw new Error(getErrorMsg('No property name supplied')); + } + + var descriptor = j$.util.getPropertyDescriptor(obj, propertyName); + + if (!descriptor) { + throw new Error(getErrorMsg(propertyName + ' property does not exist')); + } + + if (!descriptor.configurable) { + throw new Error( + getErrorMsg(propertyName + ' is not declared configurable') + ); + } + + if (!descriptor[accessType]) { + throw new Error( + getErrorMsg( + 'Property ' + + propertyName + + ' does not have access type ' + + accessType + ) + ); + } + + if (j$.isSpy(descriptor[accessType])) { + if (this.respy) { + return descriptor[accessType]; + } else { + throw new Error( + getErrorMsg( + propertyName + '#' + accessType + ' has already been spied upon' + ) + ); + } + } + + var originalDescriptor = j$.util.clone(descriptor), + spy = createSpy(propertyName, descriptor[accessType]), + restoreStrategy; + + if (Object.prototype.hasOwnProperty.call(obj, propertyName)) { + restoreStrategy = function() { + Object.defineProperty(obj, propertyName, originalDescriptor); + }; + } else { + restoreStrategy = function() { + delete obj[propertyName]; + }; + } + + currentSpies().push({ + restoreObjectToOriginalState: restoreStrategy + }); + + descriptor[accessType] = spy; + + Object.defineProperty(obj, propertyName, descriptor); + + return spy; + }; + + this.spyOnAllFunctions = function(obj, includeNonEnumerable) { + if (j$.util.isUndefined(obj)) { + throw new Error( + 'spyOnAllFunctions could not find an object to spy upon' + ); + } + + var pointer = obj, + propsToSpyOn = [], + properties, + propertiesToSkip = []; + + while ( + pointer && + (!includeNonEnumerable || pointer !== Object.prototype) + ) { + properties = getProps(pointer, includeNonEnumerable); + properties = properties.filter(function(prop) { + return propertiesToSkip.indexOf(prop) === -1; + }); + propertiesToSkip = propertiesToSkip.concat(properties); + propsToSpyOn = propsToSpyOn.concat( + getSpyableFunctionProps(pointer, properties) + ); + pointer = Object.getPrototypeOf(pointer); + } + + for (var i = 0; i < propsToSpyOn.length; i++) { + this.spyOn(obj, propsToSpyOn[i]); + } + + return obj; + }; + + this.clearSpies = function() { + var spies = currentSpies(); + for (var i = spies.length - 1; i >= 0; i--) { + var spyEntry = spies[i]; + spyEntry.restoreObjectToOriginalState(); + } + }; + } + + function getProps(obj, includeNonEnumerable) { + var enumerableProperties = Object.keys(obj); + + if (!includeNonEnumerable) { + return enumerableProperties; + } + + return Object.getOwnPropertyNames(obj).filter(function(prop) { + return ( + prop !== 'constructor' || + enumerableProperties.indexOf('constructor') > -1 + ); + }); + } + + function getSpyableFunctionProps(obj, propertiesToCheck) { + var props = [], + prop; + for (var i = 0; i < propertiesToCheck.length; i++) { + prop = propertiesToCheck[i]; + if ( + Object.prototype.hasOwnProperty.call(obj, prop) && + isSpyableProp(obj, prop) + ) { + props.push(prop); + } + } + return props; + } + + function isSpyableProp(obj, prop) { + var value, descriptor; + try { + value = obj[prop]; + } catch (e) { + return false; + } + if (value instanceof Function) { + descriptor = Object.getOwnPropertyDescriptor(obj, prop); + return (descriptor.writable || descriptor.set) && descriptor.configurable; + } + return false; + } + + return SpyRegistry; +}; + +getJasmineRequireObj().SpyStrategy = function(j$) { + /** + * @interface SpyStrategy + */ + function SpyStrategy(options) { + options = options || {}; + + var self = this; + + /** + * Get the identifying information for the spy. + * @name SpyStrategy#identity + * @since 3.0.0 + * @member + * @type {String} + */ + this.identity = options.name || 'unknown'; + this.originalFn = options.fn || function() {}; + this.getSpy = options.getSpy || function() {}; + this.plan = this._defaultPlan = function() {}; + + var k, + cs = options.customStrategies || {}; + for (k in cs) { + if (j$.util.has(cs, k) && !this[k]) { + this[k] = createCustomPlan(cs[k]); + } + } + + var getPromise = + typeof options.getPromise === 'function' + ? options.getPromise + : function() {}; + + var requirePromise = function(name) { + var Promise = getPromise(); + + if (!Promise) { + throw new Error( + name + + ' requires global Promise, or `Promise` configured with `jasmine.getEnv().configure()`' + ); + } + + return Promise; + }; + + /** + * Tell the spy to return a promise resolving to the specified value when invoked. + * @name SpyStrategy#resolveTo + * @since 3.5.0 + * @function + * @param {*} value The value to return. + */ + this.resolveTo = function(value) { + var Promise = requirePromise('resolveTo'); + self.plan = function() { + return Promise.resolve(value); + }; + return self.getSpy(); + }; + + /** + * Tell the spy to return a promise rejecting with the specified value when invoked. + * @name SpyStrategy#rejectWith + * @since 3.5.0 + * @function + * @param {*} value The value to return. + */ + this.rejectWith = function(value) { + var Promise = requirePromise('rejectWith'); + + self.plan = function() { + return Promise.reject(value); + }; + return self.getSpy(); + }; + } + + function createCustomPlan(factory) { + return function() { + var plan = factory.apply(null, arguments); + + if (!j$.isFunction_(plan)) { + throw new Error('Spy strategy must return a function'); + } + + this.plan = plan; + return this.getSpy(); + }; + } + + /** + * Execute the current spy strategy. + * @name SpyStrategy#exec + * @since 2.0.0 + * @function + */ + SpyStrategy.prototype.exec = function(context, args, invokeNew) { + var contextArgs = [context].concat( + args ? Array.prototype.slice.call(args) : [] + ); + var target = this.plan.bind.apply(this.plan, contextArgs); + + return invokeNew ? new target() : target(); + }; + + /** + * Tell the spy to call through to the real implementation when invoked. + * @name SpyStrategy#callThrough + * @since 2.0.0 + * @function + */ + SpyStrategy.prototype.callThrough = function() { + this.plan = this.originalFn; + return this.getSpy(); + }; + + /** + * Tell the spy to return the value when invoked. + * @name SpyStrategy#returnValue + * @since 2.0.0 + * @function + * @param {*} value The value to return. + */ + SpyStrategy.prototype.returnValue = function(value) { + this.plan = function() { + return value; + }; + return this.getSpy(); + }; + + /** + * Tell the spy to return one of the specified values (sequentially) each time the spy is invoked. + * @name SpyStrategy#returnValues + * @since 2.1.0 + * @function + * @param {...*} values - Values to be returned on subsequent calls to the spy. + */ + SpyStrategy.prototype.returnValues = function() { + var values = Array.prototype.slice.call(arguments); + this.plan = function() { + return values.shift(); + }; + return this.getSpy(); + }; + + /** + * Tell the spy to throw an error when invoked. + * @name SpyStrategy#throwError + * @since 2.0.0 + * @function + * @param {Error|Object|String} something Thing to throw + */ + SpyStrategy.prototype.throwError = function(something) { + var error = j$.isString_(something) ? new Error(something) : something; + this.plan = function() { + throw error; + }; + return this.getSpy(); + }; + + /** + * Tell the spy to call a fake implementation when invoked. + * @name SpyStrategy#callFake + * @since 2.0.0 + * @function + * @param {Function} fn The function to invoke with the passed parameters. + */ + SpyStrategy.prototype.callFake = function(fn) { + if ( + !( + j$.isFunction_(fn) || + j$.isAsyncFunction_(fn) || + j$.isGeneratorFunction_(fn) + ) + ) { + throw new Error( + 'Argument passed to callFake should be a function, got ' + fn + ); + } + this.plan = fn; + return this.getSpy(); + }; + + /** + * Tell the spy to do nothing when invoked. This is the default. + * @name SpyStrategy#stub + * @since 2.0.0 + * @function + */ + SpyStrategy.prototype.stub = function(fn) { + this.plan = function() {}; + return this.getSpy(); + }; + + SpyStrategy.prototype.isConfigured = function() { + return this.plan !== this._defaultPlan; + }; + + return SpyStrategy; +}; + +getJasmineRequireObj().StackTrace = function(j$) { + function StackTrace(error) { + var lines = error.stack.split('\n').filter(function(line) { + return line !== ''; + }); + + var extractResult = extractMessage(error.message, lines); + + if (extractResult) { + this.message = extractResult.message; + lines = extractResult.remainder; + } + + var parseResult = tryParseFrames(lines); + this.frames = parseResult.frames; + this.style = parseResult.style; + } + + var framePatterns = [ + // PhantomJS on Linux, Node, Chrome, IE, Edge + // e.g. " at QueueRunner.run (http://localhost:8888/__jasmine__/jasmine.js:4320:20)" + // Note that the "function name" can include a surprisingly large set of + // characters, including angle brackets and square brackets. + { + re: /^\s*at ([^\)]+) \(([^\)]+)\)$/, + fnIx: 1, + fileLineColIx: 2, + style: 'v8' + }, + + // NodeJS alternate form, often mixed in with the Chrome style + // e.g. " at /some/path:4320:20 + { re: /\s*at (.+)$/, fileLineColIx: 1, style: 'v8' }, + + // PhantomJS on OS X, Safari, Firefox + // e.g. "run@http://localhost:8888/__jasmine__/jasmine.js:4320:27" + // or "http://localhost:8888/__jasmine__/jasmine.js:4320:27" + { + re: /^(([^@\s]+)@)?([^\s]+)$/, + fnIx: 2, + fileLineColIx: 3, + style: 'webkit' + } + ]; + + // regexes should capture the function name (if any) as group 1 + // and the file, line, and column as group 2. + function tryParseFrames(lines) { + var style = null; + var frames = lines.map(function(line) { + var convertedLine = first(framePatterns, function(pattern) { + var overallMatch = line.match(pattern.re), + fileLineColMatch; + if (!overallMatch) { + return null; + } + + fileLineColMatch = overallMatch[pattern.fileLineColIx].match( + /^(.*):(\d+):\d+$/ + ); + if (!fileLineColMatch) { + return null; + } + + style = style || pattern.style; + return { + raw: line, + file: fileLineColMatch[1], + line: parseInt(fileLineColMatch[2], 10), + func: overallMatch[pattern.fnIx] + }; + }); + + return convertedLine || { raw: line }; + }); + + return { + style: style, + frames: frames + }; + } + + function first(items, fn) { + var i, result; + + for (i = 0; i < items.length; i++) { + result = fn(items[i]); + + if (result) { + return result; + } + } + } + + function extractMessage(message, stackLines) { + var len = messagePrefixLength(message, stackLines); + + if (len > 0) { + return { + message: stackLines.slice(0, len).join('\n'), + remainder: stackLines.slice(len) + }; + } + } + + function messagePrefixLength(message, stackLines) { + if (!stackLines[0].match(/^\w*Error/)) { + return 0; + } + + var messageLines = message.split('\n'); + var i; + + for (i = 1; i < messageLines.length; i++) { + if (messageLines[i] !== stackLines[i]) { + return 0; + } + } + + return messageLines.length; + } + + return StackTrace; +}; + +getJasmineRequireObj().Suite = function(j$) { + /** + * @interface Suite + * @see Env#topSuite + * @since 2.0.0 + */ + function Suite(attrs) { + this.env = attrs.env; + /** + * The unique ID of this suite. + * @name Suite#id + * @readonly + * @type {string} + * @since 2.0.0 + */ + this.id = attrs.id; + /** + * The parent of this suite, or null if this is the top suite. + * @name Suite#parentSuite + * @readonly + * @type {Suite} + */ + this.parentSuite = attrs.parentSuite; + /** + * The description passed to the {@link describe} that created this suite. + * @name Suite#description + * @readonly + * @type {string} + * @since 2.0.0 + */ + this.description = attrs.description; + this.expectationFactory = attrs.expectationFactory; + this.asyncExpectationFactory = attrs.asyncExpectationFactory; + this.expectationResultFactory = attrs.expectationResultFactory; + this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure; + this.autoCleanClosures = + attrs.autoCleanClosures === undefined ? true : !!attrs.autoCleanClosures; + + this.beforeFns = []; + this.afterFns = []; + this.beforeAllFns = []; + this.afterAllFns = []; + + this.timer = attrs.timer || new j$.Timer(); + + /** + * The suite's children. + * @name Suite#children + * @type {Array.<(Spec|Suite)>} + * @since 2.0.0 + */ + this.children = []; + + this.reset(); + } + + Suite.prototype.setSuiteProperty = function(key, value) { + this.result.properties = this.result.properties || {}; + this.result.properties[key] = value; + }; + + Suite.prototype.expect = function(actual) { + return this.expectationFactory(actual, this); + }; + + Suite.prototype.expectAsync = function(actual) { + return this.asyncExpectationFactory(actual, this); + }; + + /** + * The full description including all ancestors of this suite. + * @name Suite#getFullName + * @function + * @returns {string} + * @since 2.0.0 + */ + Suite.prototype.getFullName = function() { + var fullName = []; + for ( + var parentSuite = this; + parentSuite; + parentSuite = parentSuite.parentSuite + ) { + if (parentSuite.parentSuite) { + fullName.unshift(parentSuite.description); + } + } + return fullName.join(' '); + }; + + /* + * Mark the suite with "pending" status + */ + Suite.prototype.pend = function() { + this.markedPending = true; + }; + + /* + * Like {@link Suite#pend}, but pending state will survive {@link Spec#reset} + * Useful for fdescribe, xdescribe, where pending state should remain. + */ + Suite.prototype.exclude = function() { + this.pend(); + this.markedExcluding = true; + }; + + Suite.prototype.beforeEach = function(fn) { + this.beforeFns.unshift(fn); + }; + + Suite.prototype.beforeAll = function(fn) { + this.beforeAllFns.push(fn); + }; + + Suite.prototype.afterEach = function(fn) { + this.afterFns.unshift(fn); + }; + + Suite.prototype.afterAll = function(fn) { + this.afterAllFns.unshift(fn); + }; + + Suite.prototype.startTimer = function() { + this.timer.start(); + }; + + Suite.prototype.endTimer = function() { + this.result.duration = this.timer.elapsed(); + }; + + function removeFns(queueableFns) { + for (var i = 0; i < queueableFns.length; i++) { + queueableFns[i].fn = null; + } + } + + Suite.prototype.cleanupBeforeAfter = function() { + if (this.autoCleanClosures) { + removeFns(this.beforeAllFns); + removeFns(this.afterAllFns); + removeFns(this.beforeFns); + removeFns(this.afterFns); + } + }; + + Suite.prototype.reset = function() { + /** + * @typedef SuiteResult + * @property {Int} id - The unique id of this suite. + * @property {String} description - The description text passed to the {@link describe} that made this suite. + * @property {String} fullName - The full description including all ancestors of this suite. + * @property {Expectation[]} failedExpectations - The list of expectations that failed in an {@link afterAll} for this suite. + * @property {Expectation[]} deprecationWarnings - The list of deprecation warnings that occurred on this suite. + * @property {String} status - Once the suite has completed, this string represents the pass/fail status of this suite. + * @property {number} duration - The time in ms for Suite execution, including any before/afterAll, before/afterEach. + * @property {Object} properties - User-supplied properties, if any, that were set using {@link Env#setSuiteProperty} + * @since 2.0.0 + */ + this.result = { + id: this.id, + description: this.description, + fullName: this.getFullName(), + failedExpectations: [], + deprecationWarnings: [], + duration: null, + properties: null + }; + this.markedPending = this.markedExcluding; + this.children.forEach(function(child) { + child.reset(); + }); + }; + + Suite.prototype.addChild = function(child) { + this.children.push(child); + }; + + Suite.prototype.status = function() { + if (this.markedPending) { + return 'pending'; + } + + if (this.result.failedExpectations.length > 0) { + return 'failed'; + } else { + return 'passed'; + } + }; + + Suite.prototype.canBeReentered = function() { + return this.beforeAllFns.length === 0 && this.afterAllFns.length === 0; + }; + + Suite.prototype.getResult = function() { + this.result.status = this.status(); + return this.result; + }; + + Suite.prototype.sharedUserContext = function() { + if (!this.sharedContext) { + this.sharedContext = this.parentSuite + ? this.parentSuite.clonedSharedUserContext() + : new j$.UserContext(); + } + + return this.sharedContext; + }; + + Suite.prototype.clonedSharedUserContext = function() { + return j$.UserContext.fromExisting(this.sharedUserContext()); + }; + + Suite.prototype.onException = function() { + if (arguments[0] instanceof j$.errors.ExpectationFailed) { + return; + } + + var data = { + matcherName: '', + passed: false, + expected: '', + actual: '', + error: arguments[0] + }; + var failedExpectation = this.expectationResultFactory(data); + + if (!this.parentSuite) { + failedExpectation.globalErrorType = 'afterAll'; + } + + this.result.failedExpectations.push(failedExpectation); + }; + ++ Suite.prototype.onMultipleDone = function() { ++ var msg; ++ ++ // Issue a deprecation. Include the context ourselves and pass ++ // ignoreRunnable: true, since getting here always means that we've already ++ // moved on and the current runnable isn't the one that caused the problem. ++ if (this.parentSuite) { ++ msg = ++ "An asynchronous function called its 'done' callback more than " + ++ 'once. This is a bug in the spec, beforeAll, beforeEach, afterAll, ' + ++ 'or afterEach function in question. This will be treated as an error ' + ++ 'in a future version. See' + ++ ' ' + ++ 'for more information.\n' + ++ '(in suite: ' + ++ this.getFullName() + ++ ')'; ++ } else { ++ msg = ++ 'A top-level beforeAll or afterAll function called its ' + ++ "'done' callback more than once. This is a bug in the beforeAll " + ++ 'or afterAll function in question. This will be treated as an ' + ++ 'error in a future version. See' + ++ ' ' + ++ 'for more information.'; ++ } ++ ++ this.env.deprecated(msg, { ignoreRunnable: true }); ++ }; ++ + Suite.prototype.addExpectationResult = function() { + if (isFailure(arguments)) { + var data = arguments[1]; + this.result.failedExpectations.push(this.expectationResultFactory(data)); + if (this.throwOnExpectationFailure) { + throw new j$.errors.ExpectationFailed(); + } + } + }; + + Suite.prototype.addDeprecationWarning = function(deprecation) { + if (typeof deprecation === 'string') { + deprecation = { message: deprecation }; + } + this.result.deprecationWarnings.push( + this.expectationResultFactory(deprecation) + ); + }; + + function isFailure(args) { + return !args[0]; + } + + return Suite; +}; + +if (typeof window == void 0 && typeof exports == 'object') { + /* globals exports */ + exports.Suite = jasmineRequire.Suite; +} + +getJasmineRequireObj().Timer = function() { + var defaultNow = (function(Date) { + return function() { + return new Date().getTime(); + }; + })(Date); + + function Timer(options) { + options = options || {}; + + var now = options.now || defaultNow, + startTime; + + this.start = function() { + startTime = now(); + }; + + this.elapsed = function() { + return now() - startTime; + }; + } + + return Timer; +}; + +getJasmineRequireObj().TreeProcessor = function() { + function TreeProcessor(attrs) { + var tree = attrs.tree, + runnableIds = attrs.runnableIds, + queueRunnerFactory = attrs.queueRunnerFactory, + nodeStart = attrs.nodeStart || function() {}, + nodeComplete = attrs.nodeComplete || function() {}, + failSpecWithNoExpectations = !!attrs.failSpecWithNoExpectations, + orderChildren = + attrs.orderChildren || + function(node) { + return node.children; + }, + excludeNode = + attrs.excludeNode || + function(node) { + return false; + }, + stats = { valid: true }, + processed = false, + defaultMin = Infinity, + defaultMax = 1 - Infinity; + + this.processTree = function() { + processNode(tree, true); + processed = true; + return stats; + }; + + this.execute = function(done) { + if (!processed) { + this.processTree(); + } + + if (!stats.valid) { + throw 'invalid order'; + } + + var childFns = wrapChildren(tree, 0); + + queueRunnerFactory({ + queueableFns: childFns, + userContext: tree.sharedUserContext(), + onException: function() { + tree.onException.apply(tree, arguments); + }, - onComplete: done ++ onComplete: done, ++ onMultipleDone: tree.onMultipleDone ++ ? tree.onMultipleDone.bind(tree) ++ : null + }); + }; + + function runnableIndex(id) { + for (var i = 0; i < runnableIds.length; i++) { + if (runnableIds[i] === id) { + return i; + } + } + } + + function processNode(node, parentExcluded) { + var executableIndex = runnableIndex(node.id); + + if (executableIndex !== undefined) { + parentExcluded = false; + } + + if (!node.children) { + var excluded = parentExcluded || excludeNode(node); + stats[node.id] = { + excluded: excluded, + willExecute: !excluded && !node.markedPending, + segments: [ + { + index: 0, + owner: node, + nodes: [node], + min: startingMin(executableIndex), + max: startingMax(executableIndex) + } + ] + }; + } else { + var hasExecutableChild = false; + + var orderedChildren = orderChildren(node); + + for (var i = 0; i < orderedChildren.length; i++) { + var child = orderedChildren[i]; + + processNode(child, parentExcluded); + + if (!stats.valid) { + return; + } + + var childStats = stats[child.id]; + + hasExecutableChild = hasExecutableChild || childStats.willExecute; + } + + stats[node.id] = { + excluded: parentExcluded, + willExecute: hasExecutableChild + }; + + segmentChildren(node, orderedChildren, stats[node.id], executableIndex); + + if (!node.canBeReentered() && stats[node.id].segments.length > 1) { + stats = { valid: false }; + } + } + } + + function startingMin(executableIndex) { + return executableIndex === undefined ? defaultMin : executableIndex; + } + + function startingMax(executableIndex) { + return executableIndex === undefined ? defaultMax : executableIndex; + } + + function segmentChildren( + node, + orderedChildren, + nodeStats, + executableIndex + ) { + var currentSegment = { + index: 0, + owner: node, + nodes: [], + min: startingMin(executableIndex), + max: startingMax(executableIndex) + }, + result = [currentSegment], + lastMax = defaultMax, + orderedChildSegments = orderChildSegments(orderedChildren); + + function isSegmentBoundary(minIndex) { + return ( + lastMax !== defaultMax && + minIndex !== defaultMin && + lastMax < minIndex - 1 + ); + } + + for (var i = 0; i < orderedChildSegments.length; i++) { + var childSegment = orderedChildSegments[i], + maxIndex = childSegment.max, + minIndex = childSegment.min; + + if (isSegmentBoundary(minIndex)) { + currentSegment = { + index: result.length, + owner: node, + nodes: [], + min: defaultMin, + max: defaultMax + }; + result.push(currentSegment); + } + + currentSegment.nodes.push(childSegment); + currentSegment.min = Math.min(currentSegment.min, minIndex); + currentSegment.max = Math.max(currentSegment.max, maxIndex); + lastMax = maxIndex; + } + + nodeStats.segments = result; + } + + function orderChildSegments(children) { + var specifiedOrder = [], + unspecifiedOrder = []; + + for (var i = 0; i < children.length; i++) { + var child = children[i], + segments = stats[child.id].segments; + + for (var j = 0; j < segments.length; j++) { + var seg = segments[j]; + + if (seg.min === defaultMin) { + unspecifiedOrder.push(seg); + } else { + specifiedOrder.push(seg); + } + } + } + + specifiedOrder.sort(function(a, b) { + return a.min - b.min; + }); + + return specifiedOrder.concat(unspecifiedOrder); + } + + function executeNode(node, segmentNumber) { + if (node.children) { + return { + fn: function(done) { + var onStart = { + fn: function(next) { + nodeStart(node, next); + } + }; + + queueRunnerFactory({ + onComplete: function() { + var args = Array.prototype.slice.call(arguments, [0]); + node.cleanupBeforeAfter(); + nodeComplete(node, node.getResult(), function() { + done.apply(undefined, args); + }); + }, + queueableFns: [onStart].concat(wrapChildren(node, segmentNumber)), + userContext: node.sharedUserContext(), + onException: function() { + node.onException.apply(node, arguments); - } ++ }, ++ onMultipleDone: node.onMultipleDone ++ ? node.onMultipleDone.bind(node) ++ : null + }); + } + }; + } else { + return { + fn: function(done) { + node.execute( + done, + stats[node.id].excluded, + failSpecWithNoExpectations + ); + } + }; + } + } + + function wrapChildren(node, segmentNumber) { + var result = [], + segmentChildren = stats[node.id].segments[segmentNumber].nodes; + + for (var i = 0; i < segmentChildren.length; i++) { + result.push( + executeNode(segmentChildren[i].owner, segmentChildren[i].index) + ); + } + + if (!stats[node.id].willExecute) { + return result; + } + + return node.beforeAllFns.concat(result).concat(node.afterAllFns); + } + } + + return TreeProcessor; +}; + +getJasmineRequireObj().UserContext = function(j$) { + function UserContext() {} + + UserContext.fromExisting = function(oldContext) { + var context = new UserContext(); + + for (var prop in oldContext) { + if (oldContext.hasOwnProperty(prop)) { + context[prop] = oldContext[prop]; + } + } + + return context; + }; + + return UserContext; +}; + +getJasmineRequireObj().version = function() { - return '3.10.1'; ++ return '3.99.1'; +}; diff --cc subprojects/jasmine-gjs/lib/update-jasmine.sh index 7abbbd221,000000000..0201235e1 mode 100755,000000..100755 --- a/subprojects/jasmine-gjs/lib/update-jasmine.sh +++ b/subprojects/jasmine-gjs/lib/update-jasmine.sh @@@ -1,5 -1,0 +1,5 @@@ +# This script is used to build our custom version of the Jasmine library by +# downloading the upstream file and applying our patches, and is meant for use +# only when upgrading to a new upstream version. - curl -o jasmine.js https://raw.githubusercontent.com/jasmine/jasmine/v3.10.1/lib/jasmine-core/jasmine.js - patch = 0.58.0') + +gjs_dep = dependency('gjs-1.0', required: false) +if gjs_dep.found() + gjs = find_program(gjs_dep.get_variable('gjs_console')) +else + gjs = find_program('gjs', 'gjs-console') +endif + +pkglibexecdir = join_paths(get_option('libexecdir'), meson.project_name()) +pkgdatadir = join_paths(get_option('datadir'), meson.project_name()) +jasmine_mod = meson.project_name() + +uninstalled_pkglibexecdir = meson.current_build_dir() +uninstalled_pkgdatadir = join_paths(meson.current_source_dir(), 'src') +uninstalled_jasmine_mod = 'lib' + +# Executables + +config = configuration_data() +if meson.is_subproject() + config.set('pkgdatadir', uninstalled_pkgdatadir) + config.set('pkglibexecdir', uninstalled_pkglibexecdir) + config.set('jasmine_mod', uninstalled_jasmine_mod) +else + config.set('pkgdatadir', join_paths(get_option('prefix'), pkgdatadir)) + config.set('pkglibexecdir', join_paths(get_option('prefix'), pkglibexecdir)) + config.set('jasmine_mod', jasmine_mod) +endif +config.set('PACKAGE_VERSION', meson.project_version()) + +jasmine = configure_file(configuration: config, input: 'bin/jasmine.in', + output: 'jasmine', install: not meson.is_subproject(), install_dir: 'bin') + - jasmine_runner = configure_file(configuration: config, ++configure_file(configuration: config, + input: 'bin/jasmine-runner.in', output: 'jasmine-runner', + install: not meson.is_subproject(), + install_dir: pkglibexecdir) + +meson.override_find_program('jasmine', jasmine) + +# Source code and Jasmine library + +if not meson.is_subproject() + install_data( + 'lib/jasmine.js', + 'src/command.js', + 'src/config.js', + 'src/consoleReporter.js', + 'src/jasmineBoot.js', + 'src/junitReporter.js', + 'src/options.js', + 'src/tapReporter.js', + 'src/timer.js', + 'src/utils.js', + 'src/verboseReporter.js', + 'src/xmlWriter.js', + install_dir: pkgdatadir, + ) +endif + +# Documentation + +if not meson.is_subproject() + install_data('jasmine.man', rename: 'jasmine.1', + install_dir: join_paths(get_option('datadir'), 'man', 'man1')) +endif + +# Tests + +tests = [ ++ '0_your_first_suite', ++ 'custom_matcher', ++ + 'commandSpec', + 'configSpec', + 'consoleReporterSpec', + 'defaultReporterSpec', - 'focusedSpecIntegrationTest', + 'importerSpec', + 'jasmineBootSpec', - 'jasmineIntegrationTest', + 'junitReporterSpec', + 'optionsSpec', + 'tapReporterSpec', + 'timerSpec', + 'utilsSpec', + 'verboseReporterSpec', + 'xmlWriterSpec', +] +if not meson.is_subproject() + test_env = environment() + test_env.set('TEST_PKGDATADIR', uninstalled_pkgdatadir) + test_env.set('TEST_PKGLIBEXECDIR', uninstalled_pkglibexecdir) + test_env.set('TEST_JASMINE_MOD', uninstalled_jasmine_mod) + foreach t : tests + test_file = files('test/@0@.js'.format(t)) + test(t, gjs, args: ['-m', jasmine, test_file, '--module', '--tap', '--no-config'], + env: test_env, protocol: 'tap') + endforeach +endif diff --cc subprojects/jasmine-gjs/release-checklist.md index c638e6427,000000000..475251e7c mode 100644,000000..100644 --- a/subprojects/jasmine-gjs/release-checklist.md +++ b/subprojects/jasmine-gjs/release-checklist.md @@@ -1,57 -1,0 +1,47 @@@ +# Release Checklist # + +## Updating to a new upstream release ## + +- [ ] Bump version in `meson.build`. +- [ ] Change upstream Jasmine version in the `lib/update-jasmine.sh` script. +- [ ] Delete `lib/jasmine.js`. +- [ ] Run `cd lib; ./update-jasmine.sh` to regenerate `lib/jasmine.js` from the new upstream version. +- [ ] Resolve patch conflicts with the new upstream version if necessary. - - [ ] If making a new major release, update `test/jasmineIntegrationTest.js` and `test/focusedSpecIntegrationTest.js` from `https://github.com/jasmine/jasmine.github.io/tree/master/_versions//src`. - Currently we use `introduction.js`, `custom_equality.js`, `custom_matcher.js`, and `focused_specs.js`, but there may be new features that should be included as well. - Strip the documentation comments and the weird indentation. ++- [ ] If making a new major release, update `test/jasmineIntegrationTest.js` and `test/focusedSpecIntegrationTest.js` from the appropriate point in the history of `https://github.com/jasmine/jasmine.github.io/tree/d9b48e17/_tutorials/src`. ++ Currently we use `0_your_first_suite.js` and `custom_matcher.js`, but there may be new features that should be included as well. ++ Remove the browser feature detection and put the "long asynchronous suite" test inside a check for an environment variable. +- [ ] If making a new major release, see if there are any new features that we can use to improve jasmine-gjs's own tests. +- [ ] Run `meson test`. +- [ ] Make a commit. +- [ ] Write release notes in `NEWS.md`. + +## Packaging: RPM ## + +- [ ] Update the version number in `jasmine-gjs.spec`. +- [ ] Add a changelog entry in `jasmine-gjs.spec`. +- [ ] Make any other necessary changes to `jasmine-gjs.spec`. +- [ ] Run `ninja dist`. +- [ ] Copy `jasmine-gjs-.tar.xz` to `rpmbuild/SOURCES`. +- [ ] Copy `jasmine-gjs.spec` to `rpmbuild/SPECS`. +- [ ] Run `rpmbuild -ba /path/to/rpmbuild/SPECS/jasmine-gjs.spec` to ensure that everything builds OK. +- [ ] Make a commit. + +## Packaging: Debian ## + +- [ ] Update the changelog with `dch`. (Distribution = `unstable`) +- [ ] Make any other necessary changes to the `debian` directory. +- [ ] Run `debuild -uc -us -b` to ensure that everything builds OK. +- [ ] Make a commit. +- [ ] Run `ninja dist`. +- [ ] Copy `jasmine-gjs-.tar.xz` to `../jasmine-gjs_.orig.tar.xz`. +- [ ] Extract the tarball. +- [ ] Enter the directory and run `debuild -uc -us -S` to build a source package. + - ## Releasing: OBS ## ++## Releasing ## + - - [ ] On [OBS](https://build.opensuse.org/project/repositories/home:ptomato), check if repositories should be enabled for any new Fedora, Ubuntu, Debian, or OpenSUSE distribution releases. - - [ ] Copy `jasmine-gjs-.tar.xz`, `jasmine-gjs.spec`, `jasmine-gjs_.orig.tar.xz`, `jasmine-gjs_-1.debian.tar.xz`, and `jasmine-gjs_-1.dsc` into an OBS checkout of the `home:ptomato/jasmine-gjs` project. - - [ ] Remove the files in the OBS checkout that are from the previous version. - - [ ] Run `osc addremove`. - - [ ] Run `osc commit`. - - [ ] Check that all builds passed. - - ## Releasing: Other ## - - - [ ] Add `jasmine-gjs-.tar.xz` to the `downloads` directory in the `ptomato/ptomato.github.com` repository. - - [ ] Modify `opensource/jasmine/jasmine.md` to point to the newest version. - - [ ] Make a commit. - - [ ] Back in the `jasmine-gjs` repository, run `git tag `; version is just dotted numbers, e.g. `2.2.1`, no `v` or `Version`. ++- [ ] Run `git tag `; version is just dotted numbers, e.g. `2.2.1`, no `v` or `Version`. +- [ ] Push the tag to GitHub. +- [ ] Copy the release notes from `NEWS.md` into https://github.com/ptomato/jasmine-gjs/releases +- [ ] Attach the tarball and the sha256sum from the `meson-dist` directory to the release notes. ++- [ ] Attach the RPM packages from `/path/to/rpmbuild/RPMS/` and `/path/to/rpmbuild/SRPMS` to the release notes. ++- [ ] Attach the Debian packages (`jasmine-gjs_-1_all.deb`, `jasmine-gjs_.orig.tar.xz`, `jasmine-gjs_-1.debian.tar.xz`, and `jasmine-gjs_-1.dsc`) to the release notes. diff --cc subprojects/jasmine-gjs/src/consoleReporter.js index ac3db0073,000000000..dfaa05830 mode 100644,000000..100644 --- a/subprojects/jasmine-gjs/src/consoleReporter.js +++ b/subprojects/jasmine-gjs/src/consoleReporter.js @@@ -1,254 -1,0 +1,262 @@@ +import Gio from 'gi://Gio'; +import GObject from 'gi://GObject'; + +import {indenter} from './utils.js'; + +const YELLOW = '\x1b[33m'; +const GREEN = '\x1b[32m'; +const RED = '\x1b[31m'; +const NORMAL = '\x1b[0m'; + ++let GioUnix = null; ++try { ++ GioUnix = (await import('gi://GioUnix')).default; ++} catch (e) {} ++ +function createNoopTimer() { + return { + start() {}, + elapsed() { + return 0; + }, + }; +} + +export const ConsoleReporter = GObject.registerClass({ + Properties: { + 'show-colors': GObject.ParamSpec.boolean('show-colors', 'Show colors', + 'Whether to print color output', + GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT_ONLY, + true), + 'jasmine-core-path': GObject.ParamSpec.string('jasmine-core-path', + 'Jasmine core path', + 'Path to Jasmine core module for stack trace purposes', + GObject.ParamFlags.READWRITE, + '/nowhere'), + }, + + Signals: { + 'started': {}, + 'complete': { + param_types: [GObject.TYPE_BOOLEAN], + }, + }, +}, class ConsoleReporter extends GObject.Object { + _init(props = {}) { + if (props.hasOwnProperty('print')) { + this._print = props.print; + delete props.print; + } + + this._timerFactory = createNoopTimer; + if (props.hasOwnProperty('timerFactory')) { + this._timerFactory = props.timerFactory; + delete props.timerFactory; + } + + super._init(props); + + // The main timer should return 0 if the run hasn't started yet + this._timers = { + 'main': createNoopTimer(), + }; + + this._failedSpecs = []; + this._failedSuites = []; + this._suiteLevel = 0; + this._specCount = 0; + this._passingCount = 0; + this._failureCount = 0; + this._pendingCount = 0; + } + + _color(str, color) { + if (typeof color !== 'undefined') + return this.show_colors ? color + str + NORMAL : str; + return str; + } + + // default print function that prints to stdout (GJS' built-in print + // functions, print() and printerr(), unfortunately append newlines to + // everything) + static getStdout() { + if (!this._stdout) { ++ const UnixOutputStream = GioUnix ++ ? GioUnix.OutputStream ++ : Gio.UnixOutputStream; + const FD_STDOUT = 1; - const fdstream = new Gio.UnixOutputStream({ ++ const fdstream = new UnixOutputStream({ + fd: FD_STDOUT, + close_fd: false, + }); + this._stdout = new Gio.DataOutputStream({ + base_stream: fdstream, + }); + } + return this._stdout; + } + + _print(str) { + ConsoleReporter.getStdout().put_string(str, null); + } + + // Used to start a timer associated with a particular ID. Subclasses can use + // this to time actions that the base class doesn't time if they wish. + startTimer(id) { + this._timers[id] = this._timerFactory(id); + this._timers[id].start(); + } + + // Used to get the elapsed time from a timer with the given ID. Subclasses + // can use this to time actions not timed by the base class. The base class + // uses timers with the following IDs: + // main - times the whole suite + // suite:foo - times the suite with ID "foo" + // spec:bar - times the spec with ID "bar" + elapsedTime(id) { + return this._timers[id].elapsed(); + } + + // Called with an "info" object with the following property: + // totalSpecsDefined - number of specs to be run + jasmineStarted() { + this.emit('started'); + this.startTimer('main'); + } + + jasmineDone() { + this.elapsedTime('main'); // Stop the timer + this.emit('complete', this._failureCount === 0); + } + + // Called with a "result" object with the following properties: + // id - a string unique to this suite + // description - the name of the suite passed to describe() + // fullName - the full name including the names of parent suites + // failedExpectations - a list of failures in this suite + suiteStarted(result) { + if (result.id) + this.startTimer(`suite:${result.id}`); + this._suiteLevel++; + } + + // Called with the same object as suiteStarted(), with an extra property: + // status - "disabled", "failed", or "finished" + // Adds another extra property if the suite was started properly with ID: + // time - time taken to execute the suite, in milliseconds + suiteDone(result) { + this._suiteLevel--; + if (result.failedExpectations && result.failedExpectations.length > 0) { + this._failureCount++; + this._failedSuites.push(result); + } + if (result.id) + result.time = this.elapsedTime(`suite:${result.id}`); + } + + // Called with a "result" object with the following properties: + // id - a string unique to this spec + // description: the name of the spec passed to it() + // fullName - the full name concatenated with the suite's full name + // failedExpectations - a list of failures in this spec + // passedExpectations - a list of succeeded expectations in this spec + specStarted(result) { + if (result.id) + this.startTimer(`spec:${result.id}`); + this._specCount++; + } + + // Called with the same object as specStarted(), with an extra property: + // status - "disabled", "pending", "failed", or "passed" + // Adds another extra property if the spec was started properly with ID: + // time - time taken to execute the spec, in milliseconds + specDone(result) { + if (result.status === 'passed') { + this._passingCount++; + } else if (result.status === 'pending') { + this._pendingCount++; + } else if (result.status === 'failed') { + this._failureCount++; + this._failedSpecs.push(result); + } + if (result.id) + result.time = this.elapsedTime(`spec:${result.id}`); + } + + filterStack(stack) { + return stack.split('\n').filter(stackLine => { + return stackLine.indexOf(this.jasmine_core_path) === -1; + }).join('\n'); + } +}); + +// This reporter has very nearly the same behaviour to Jasmine's default console +// reporter. +export const DefaultReporter = GObject.registerClass(class DefaultReporter extends ConsoleReporter { + jasmineStarted(info) { + super.jasmineStarted(info); + this._print('Started\n'); + } + + jasmineDone() { + this._print('\n\n'); + if (this._failedSpecs.length > 0) + this._print('Failures:'); + this._failedSpecs.forEach(this._printSpecFailureDetails, this); + + if (this._specCount > 0) { + this._print('\n'); + this._print(`${this._specCount} spec${this._specCount === 1 ? '' : 's'}, ${this._failureCount} failed`); + + if (this._pendingCount) + this._print(`, ${this._pendingCount} pending`); + } else { + this._print('No specs found'); + } + + this._print('\n'); + const seconds = Math.round(this.elapsedTime('main')) / 1000; + this._print(`\nFinished in ${seconds} s\n`); + + this._failedSuites.forEach(this._printSuiteFailureDetails, this); + + super.jasmineDone(); + } + + specDone(result) { + super.specDone(result); + + const colors = { + passed: GREEN, + pending: YELLOW, + failed: RED, + disabled: undefined, + }; + const symbols = { + passed: '.', + pending: '*', + failed: 'F', + disabled: '', + }; + this._print(this._color(symbols[result.status], colors[result.status])); + } + + _printSpecFailureDetails(result, index) { + this._print(`\n${index + 1}) ${result.fullName}\n`); + result.failedExpectations.forEach(failedExpectation => { + const report = `Message: +${this._color(failedExpectation.message, RED)} +Stack: +${this.filterStack(failedExpectation.stack)} +`; + this._print(indenter.indent(report, 2)); + }); + } + + _printSuiteFailureDetails(result) { + result.failedExpectations.forEach(failedExpectation => { + this._print(this._color(`An error was thrown in an afterAll +AfterAll ${failedExpectation.message}`, RED)); + }); + } +}); diff --cc subprojects/jasmine-gjs/test/0_your_first_suite.js index 000000000,000000000..e2a79bc7b new file mode 100644 --- /dev/null +++ b/subprojects/jasmine-gjs/test/0_your_first_suite.js @@@ -1,0 -1,0 +1,705 @@@ ++// This suite is Jasmine's documentation suite, exercising all of Jasmine's ++// functionality to make sure that the GJS test runner has hooked everything up ++// correctly. It's taken from the following pages: ++// https://github.com/jasmine/jasmine.github.io/blob/3.99-4.0/_tutorials/src/0_your_first_suite.js ++// ++// Note: the "long asynchronous specs" suite near the bottom takes 9 seconds to ++// run. It is marked pending by default. To run this suite anyway, define an ++// environment variable RUN_THOROUGH_TESTS=yes. ++ ++import GLib from 'gi://GLib'; ++ ++/** ++ ## Suites: `describe` Your Tests ++ The [describe](/api/edge/global.html#describe) function is for grouping related specs, typically each test file has one at the top level. ++ The string parameter is for naming the collection of specs, and will be concatenated with specs to make a spec's full name. ++ This aids in finding specs in a large suite. ++ If you name them well, your specs read as full sentences in traditional [BDD](http://en.wikipedia.org/wiki/Behavior-driven_development) style. ++ ++ ## Specs ++ Specs are defined by calling the global Jasmine function [it](/api/edge/global.html#it), which, like `describe` takes a string and a function. ++ The string is the title of the spec and the function is the spec, or test. ++ A spec contains one or more expectations that test the state of the code. ++ An expectation in Jasmine is an assertion that is either true or false. ++ A spec with all true expectations is a passing spec. A spec with one or more false expectations is a failing spec. ++ */ ++describe("A suite", function() { ++ it("contains spec with an expectation", function() { ++ expect(true).toBe(true); ++ }); ++}); ++ ++/** ++ ### It's Just Functions ++ Since `describe` and `it` blocks are functions, they can contain any executable code necessary to implement the test. JavaScript scoping rules apply, so variables declared in a `describe` are available to any `it` block inside the suite. ++ */ ++describe("A suite is just a function", function() { ++ var a; ++ ++ it("and so is a spec", function() { ++ a = true; ++ ++ expect(a).toBe(true); ++ }); ++}); ++ ++/** ++ ## Expectations ++ Expectations are built with the function `expect` which takes a value, called the actual. ++ It is chained with a Matcher function, which takes the expected value. ++ */ ++describe("The 'toBe' matcher compares with ===", function() { ++ /** ++ ### Matchers ++ Each matcher implements a boolean comparison between the actual value and the expected value. ++ It is responsible for reporting to Jasmine if the expectation is true or false. ++ Jasmine will then pass or fail the spec. ++ */ ++ ++ it("and has a positive case", function() { ++ expect(true).toBe(true); ++ }); ++ ++ /** ++ Any matcher can evaluate to a negative assertion by chaining the call to `expect` with a `not` before calling the matcher. ++ */ ++ ++ it("and can have a negative case", function() { ++ expect(false).not.toBe(true); ++ }); ++ ++/** ++ Jasmine has a rich set of matchers included, you can find the full list in the [API docs](/api/edge/matchers.html) ++ There is also the ability to write [custom matchers](custom_matcher.html) for when a project's domain calls for specific assertions that are not included in Jasmine. ++ */ ++}); ++ ++/** ++ ### Setup and Teardown ++ To help a test suite DRY up any duplicated setup and teardown code, Jasmine provides the global [beforeEach](/api/edge/global.html#beforeEach), [afterEach](/api/edge/global.html#afterEach), [beforeAll](/api/edge/global.html#beforeAll), and [afterAll](/api/edge/global.html#afterAll) functions. ++ */ ++describe("A suite with some shared setup", function() { ++ var foo = 0; ++ ++ // As the name implies, the `beforeEach` function is called once before each spec in the `describe` in which it is called ++ beforeEach(function() { ++ foo += 1; ++ }); ++ ++ // and the `afterEach` function is called once after each spec. ++ afterEach(function() { ++ foo = 0; ++ }); ++ ++ // The `beforeAll` function is called only once before all the specs in `describe` are run ++ beforeAll(function() { ++ foo = 1; ++ }); ++ ++ // and the `afterAll` function is called after all specs finish ++ afterAll(function() { ++ foo = 0; ++ }); ++ ++}); ++ ++/** ++ * `beforeAll` and `afterAll` can be used to speed up test suites with expensive setup and teardown. ++ * ++ * However, be careful using `beforeAll` and `afterAll`! ++ * Since they are not reset between specs, it is easy to accidentally leak state between your specs so that they erroneously pass or fail. ++ */ ++ ++ ++/** ++### The `this` keyword ++Another way to share variables between a `beforeEach`, `it`, and `afterEach` is through the `this` keyword. Each spec's `beforeEach`/`it`/`afterEach` has the `this` as the same empty object that is set back to empty for the next spec's `beforeEach`/`it`/`afterEach`. ++*/ ++describe("A spec", function() { ++ beforeEach(function() { ++ this.foo = 0; ++ }); ++ ++ it("can use the `this` to share state", function() { ++ expect(this.foo).toEqual(0); ++ this.bar = "test pollution?"; ++ }); ++ ++ it("prevents test pollution by having an empty `this` created for the next spec", function() { ++ expect(this.foo).toEqual(0); ++ expect(this.bar).toBe(undefined); ++ }); ++}); ++ ++ ++/** ++ ### Manually failing a spec with `fail` ++ The `fail` function causes a spec to fail. It can take a failure message or an Error object as a parameter. ++ */ ++ ++describe("A spec using the fail function", function() { ++ var foo = function(x, callBack) { ++ if (x) { ++ callBack(); ++ } ++ }; ++ ++ it("should not call the callBack", function() { ++ foo(false, function() { ++ fail("Callback has been called"); ++ }); ++ }); ++}); ++ ++/** ++ ### Nesting `describe` Blocks ++ Calls to `describe` can be nested, with specs defined at any level. This allows a suite to be composed as a tree of functions. Before a spec is executed, Jasmine walks down the tree executing each `beforeEach` function in order. After the spec is executed, Jasmine walks through the `afterEach` functions similarly. ++ */ ++describe("A spec", function() { ++ var foo; ++ ++ beforeEach(function() { ++ foo = 0; ++ foo += 1; ++ }); ++ ++ afterEach(function() { ++ foo = 0; ++ }); ++ ++ it("is just a function, so it can contain any code", function() { ++ expect(foo).toEqual(1); ++ }); ++ ++ it("can have more than one expectation", function() { ++ expect(foo).toEqual(1); ++ expect(true).toEqual(true); ++ }); ++ ++ describe("nested inside a second describe", function() { ++ var bar; ++ ++ beforeEach(function() { ++ bar = 1; ++ }); ++ ++ it("can reference both scopes as needed", function() { ++ expect(foo).toEqual(bar); ++ }); ++ }); ++}); ++ ++/** ++ ## Disabling Suites ++ Suites can be disabled with the `xdescribe` function. These suites and any specs inside them are skipped when run and thus their results will show as pending. ++ */ ++xdescribe("A spec", function() { ++ var foo; ++ ++ beforeEach(function() { ++ foo = 0; ++ foo += 1; ++ }); ++ ++ it("is just a function, so it can contain any code", function() { ++ expect(foo).toEqual(1); ++ }); ++}); ++ ++/** ++ ## Pending Specs ++ Pending specs do not run, but their names will show up in the results as `pending`. ++ */ ++ ++describe("Pending specs", function() { ++ ++ /** Any spec declared with `xit` is marked as pending. ++ */ ++ xit("can be declared 'xit'", function() { ++ expect(true).toBe(false); ++ }); ++ ++ /** Any spec declared without a function body will also be marked pending in results. ++ */ ++ ++ it("can be declared with 'it' but without a function"); ++ ++ /** And if you call the function `pending` anywhere in the spec body, no matter the expectations, the spec will be marked pending. ++ * A string passed to `pending` will be treated as a reason and displayed when the suite finishes. ++ */ ++ it("can be declared by calling 'pending' in the spec body", function() { ++ expect(true).toBe(false); ++ pending('this is why it is pending'); ++ }); ++}); ++ ++/** ++ ## Spies ++ Jasmine has test double functions called [spies](/api/edge/Spy.html). ++ A spy can stub any function and tracks calls to it and all arguments. ++ A spy only exists in the `describe` or `it` block in which it is defined, and will be removed after each spec. ++ There are special matchers for interacting with spies. ++ */ ++ ++describe("A spy", function() { ++ var foo, bar = null; ++ ++ beforeEach(function() { ++ foo = { ++ setBar: function(value) { ++ bar = value; ++ } ++ }; ++ ++ // You can define what the spy will do when invoked with [and](/api/edge/Spy_and.html). ++ spyOn(foo, 'setBar'); ++ ++ foo.setBar(123); ++ foo.setBar(456, 'another param'); ++ }); ++ ++ // The `toHaveBeenCalled` matcher will pass if the spy was called. ++ it("tracks that the spy was called", function() { ++ expect(foo.setBar).toHaveBeenCalled(); ++ }); ++ ++ // The `toHaveBeenCalledTimes` matcher will pass if the spy was called the specified number of times. ++ it("tracks that the spy was called x times", function() { ++ expect(foo.setBar).toHaveBeenCalledTimes(2); ++ }); ++ ++ // The `toHaveBeenCalledWith` matcher will return true if the argument list matches any of the recorded calls to the spy. ++ it("tracks all the arguments of its calls", function() { ++ expect(foo.setBar).toHaveBeenCalledWith(123); ++ expect(foo.setBar).toHaveBeenCalledWith(456, 'another param'); ++ }); ++ ++ it("stops all execution on a function", function() { ++ expect(bar).toBeNull(); ++ }); ++ ++ // You get all of the data that a spy tracks about its calls with [calls](/api/edge/Spy_calls.html) ++ it("tracks if it was called at all", function() { ++ foo.setBar(); ++ ++ expect(foo.setBar.calls.any()).toEqual(true); ++ }); ++}); ++ ++/** ++ ### Spies: `createSpy` ++ When there is not a function to spy on, [jasmine.createSpy](/api/edge/jasmine.html#.createSpy) can create a "bare" spy. ++ This spy acts as any other spy - tracking calls, arguments, etc. But there is no implementation behind it. ++ */ ++describe("A spy, when created manually", function() { ++ var whatAmI; ++ ++ beforeEach(function() { ++ whatAmI = jasmine.createSpy('whatAmI'); ++ ++ whatAmI("I", "am", "a", "spy"); ++ }); ++ ++ it("tracks that the spy was called", function() { ++ expect(whatAmI).toHaveBeenCalled(); ++ }); ++}); ++ ++/** ++ ### Spies: `createSpyObj` ++ In order to create a mock with multiple spies, use [jasmine.createSpyObj](/api/edge/jasmine.html#.createSpyObj) and pass an array of strings. ++ It returns an object that has a property for each string that is a spy. ++ */ ++describe("Multiple spies, when created manually", function() { ++ var tape; ++ ++ beforeEach(function() { ++ tape = jasmine.createSpyObj('tape', ['play', 'pause', 'stop', 'rewind']); ++ ++ tape.play(); ++ tape.pause(); ++ tape.rewind(0); ++ }); ++ ++ it("creates spies for each requested function", function() { ++ expect(tape.play).toBeDefined(); ++ expect(tape.pause).toBeDefined(); ++ expect(tape.stop).toBeDefined(); ++ expect(tape.rewind).toBeDefined(); ++ }); ++}); ++ ++/** ++ * ## Matching with more finesse ++ * ++ * Sometimes you don't want to match with exact equality. ++ * Jasmine provides a number of asymmetric equality testers. ++ */ ++describe("Matching with finesse", function() { ++ ++ /** ++ * [jasmine.any](/api/edge/jasmine.html#.any) takes a constructor or "class" name as an expected value. ++ * It returns `true` if the constructor matches the constructor of the actual value. ++ */ ++ describe("jasmine.any", function() { ++ it("matches any value", function() { ++ expect({}).toEqual(jasmine.any(Object)); ++ expect(12).toEqual(jasmine.any(Number)); ++ }); ++ ++ describe("when used with a spy", function() { ++ it("is useful for comparing arguments", function() { ++ var foo = jasmine.createSpy('foo'); ++ foo(12, function() { ++ return true; ++ }); ++ ++ expect(foo).toHaveBeenCalledWith(jasmine.any(Number), jasmine.any(Function)); ++ }); ++ }); ++ }); ++ ++ /** ++ [jasmine.anything](/api/edge/global.html#.anything) returns `true` if the actual value is not `null` or `undefined`. ++ */ ++ describe("jasmine.anything", function() { ++ it("matches anything", function() { ++ expect(1).toEqual(jasmine.anything()); ++ }); ++ ++ describe("when used with a spy", function() { ++ it("is useful when the argument can be ignored", function() { ++ var foo = jasmine.createSpy('foo'); ++ foo(12, function() { ++ return false; ++ }); ++ ++ expect(foo).toHaveBeenCalledWith(12, jasmine.anything()); ++ }); ++ }); ++ }); ++ ++ /** ++ [jasmine.objectContaining](/api/edge/global.html#.objectContaining) is for those times when an expectation only cares about certain key/value pairs in the actual. ++ */ ++ describe("jasmine.objectContaining", function() { ++ var foo; ++ ++ beforeEach(function() { ++ foo = { ++ a: 1, ++ b: 2, ++ bar: "baz" ++ }; ++ }); ++ ++ it("matches objects with the expect key/value pairs", function() { ++ expect(foo).toEqual(jasmine.objectContaining({ ++ bar: "baz" ++ })); ++ expect(foo).not.toEqual(jasmine.objectContaining({ ++ c: 37 ++ })); ++ }); ++ ++ describe("when used with a spy", function() { ++ it("is useful for comparing arguments", function() { ++ var callback = jasmine.createSpy('callback'); ++ ++ callback({ ++ bar: "baz" ++ }); ++ ++ expect(callback).toHaveBeenCalledWith(jasmine.objectContaining({ ++ bar: "baz" ++ })); ++ }); ++ }); ++ }); ++ ++ /** ++ [jasmine.arrayContaining](/api/edge/global.html#.arrayContaining) is for those times when an expectation only cares about some of the values in an array. ++ */ ++ describe("jasmine.arrayContaining", function() { ++ var foo; ++ ++ beforeEach(function() { ++ foo = [1, 2, 3, 4]; ++ }); ++ ++ it("matches arrays with some of the values", function() { ++ expect(foo).toEqual(jasmine.arrayContaining([3, 1])); ++ expect(foo).not.toEqual(jasmine.arrayContaining([6])); ++ }); ++ ++ describe("when used with a spy", function() { ++ it("is useful when comparing arguments", function() { ++ var callback = jasmine.createSpy('callback'); ++ ++ callback([1, 2, 3, 4]); ++ ++ expect(callback).toHaveBeenCalledWith(jasmine.arrayContaining([4, 2, 3])); ++ expect(callback).not.toHaveBeenCalledWith(jasmine.arrayContaining([5, 2])); ++ }); ++ }); ++ }); ++ ++ /** ++ [jasmine.stringMatching](/api/edge/global.html#.stringMatching) is for when you don't want to match a string in a larger object exactly, or match a portion of a string in a spy expectation. ++ */ ++ describe('jasmine.stringMatching', function() { ++ it("matches as a regexp", function() { ++ expect({foo: 'bar'}).toEqual({foo: jasmine.stringMatching(/^bar$/)}); ++ expect({foo: 'foobarbaz'}).toEqual({foo: jasmine.stringMatching('bar')}); ++ }); ++ ++ describe("when used with a spy", function() { ++ it("is useful for comparing arguments", function() { ++ var callback = jasmine.createSpy('callback'); ++ ++ callback('foobarbaz'); ++ ++ expect(callback).toHaveBeenCalledWith(jasmine.stringMatching('bar')); ++ expect(callback).not.toHaveBeenCalledWith(jasmine.stringMatching(/^bar$/)); ++ }); ++ }); ++ }); ++ ++ /** ++ ### Custom asymmetric equality tester ++ When you need to check that something meets a certain criteria, without being strictly equal, you can also specify a custom asymmetric equality tester simply by providing an object that has an `asymmetricMatch` function. ++ */ ++ describe("custom asymmetry", function() { ++ var tester = { ++ asymmetricMatch: function(actual) { ++ var secondValue = actual.split(',')[1]; ++ return secondValue === 'bar'; ++ } ++ }; ++ ++ it("dives in deep", function() { ++ expect("foo,bar,baz,quux").toEqual(tester); ++ }); ++ ++ describe("when used with a spy", function() { ++ it("is useful for comparing arguments", function() { ++ var callback = jasmine.createSpy('callback'); ++ ++ callback('foo,bar,baz'); ++ ++ expect(callback).toHaveBeenCalledWith(tester); ++ }); ++ }); ++ }); ++}); ++ ++ ++/** ++ ## Jasmine Clock ++ The [Jasmine Clock](/api/edge/Clock.html) is available for testing time dependent code. ++ */ ++describe("Manually ticking the Jasmine Clock", function() { ++ var timerCallback; ++ ++ /** ++ It is installed with a call to `jasmine.clock().install` in a spec or suite that needs to manipulate time. ++ */ ++ beforeEach(function() { ++ timerCallback = jasmine.createSpy("timerCallback"); ++ jasmine.clock().install(); ++ }); ++ ++ /** ++ Be sure to uninstall the clock after you are done to restore the original functions. ++ */ ++ afterEach(function() { ++ jasmine.clock().uninstall(); ++ }); ++ ++ /** ++ ### Mocking the JavaScript Timeout Functions ++ You can make `setTimeout` or `setInterval` synchronous executing the registered functions only once the clock is ticked forward in time. ++ ++ To execute registered functions, move time forward via the `jasmine.clock().tick` function, which takes a number of milliseconds. ++ */ ++ it("causes a timeout to be called synchronously", function() { ++ setTimeout(function() { ++ timerCallback(); ++ }, 100); ++ ++ expect(timerCallback).not.toHaveBeenCalled(); ++ ++ jasmine.clock().tick(101); ++ ++ expect(timerCallback).toHaveBeenCalled(); ++ }); ++ ++ it("causes an interval to be called synchronously", function() { ++ setInterval(function() { ++ timerCallback(); ++ }, 100); ++ ++ expect(timerCallback).not.toHaveBeenCalled(); ++ ++ jasmine.clock().tick(101); ++ expect(timerCallback.calls.count()).toEqual(1); ++ ++ jasmine.clock().tick(50); ++ expect(timerCallback.calls.count()).toEqual(1); ++ ++ jasmine.clock().tick(50); ++ expect(timerCallback.calls.count()).toEqual(2); ++ }); ++ ++ /** ++ ### Mocking the Date ++ The Jasmine Clock can also be used to mock the current date. ++ */ ++ describe("Mocking the Date object", function(){ ++ it("mocks the Date object and sets it to a given time", function() { ++ var baseTime = new Date(2013, 9, 23); ++ // If you do not provide a base time to `mockDate` it will use the current date. ++ jasmine.clock().mockDate(baseTime); ++ ++ jasmine.clock().tick(50); ++ expect(new Date().getTime()).toEqual(baseTime.getTime() + 50); ++ }); ++ }); ++}); ++ ++ ++/** ++ ## Asynchronous Support ++ Jasmine also has support for running specs that require testing asynchronous operations. The functions that you pass to `beforeAll`, `afterAll`, `beforeEach`, `afterEach`, and `it` can be asynchronous. There are three different ways to indicate that a function is asynchronous: by taking an optional callback parameter, by returning a promise, or by using the `async` keyword in environments that support it. ++ */ ++describe("Asynchronous specs", function() { ++ var value; ++ ++ /** ++ ### Using callbacks ++ */ ++ describe("Using callbacks", function() { ++ /** ++ Calls to `beforeAll`, `afterAll`, `beforeEach`, `afterEach`, and `it` can take an optional single argument that should be called when the async work is complete. ++ */ ++ beforeEach(function(done) { ++ setTimeout(function() { ++ value = 0; ++ done(); ++ }, 1); ++ }); ++ ++ /** ++ This spec will not start until the `done` function is called in the call to `beforeEach` above. And this spec will not complete until its `done` is called. ++ */ ++ ++ it("should support async execution of test preparation and expectations", function(done) { ++ value++; ++ expect(value).toBeGreaterThan(0); ++ done(); ++ }); ++ ++ /** ++ The `done.fail` function fails the spec and indicates that it has completed. ++ */ ++ describe("A spec using done.fail", function() { ++ var foo = function(x, callBack1, callBack2) { ++ if (x) { ++ setTimeout(callBack1, 0); ++ } else { ++ setTimeout(callBack2, 0); ++ } ++ }; ++ ++ it("should not call the second callBack", function(done) { ++ foo(true, ++ done, ++ function() { ++ done.fail("Second callback has been called"); ++ } ++ ); ++ }); ++ }); ++ }); ++ ++ /** ++ ### Using promises ++ */ ++ describe("Using promises", function() { ++ /** ++ Functions passed to `beforeAll`, `afterAll`, `beforeEach`, `afterEach`, and `it` can return a promise that should be resolved when the async work is complete. If the promise is rejected, all specs in the enclosing `describe` will fail. ++ */ ++ beforeEach(function() { ++ return soon().then(function() { ++ value = 0; ++ }); ++ }); ++ ++ /** ++ This spec will not start until the promise returned from the call to `beforeEach` above is settled. And this spec will not complete until the promise that it returns is settled. If the promise is rejected, the spec will fail. ++ */ ++ it("should support async execution of test preparation and expectations", function() { ++ return soon().then(function() { ++ value++; ++ expect(value).toBeGreaterThan(0); ++ }); ++ }); ++ }); ++ ++ /** ++ ### Using async/await ++ */ ++ describe("Using async/await", function() { ++ /** ++ Functions passed to `beforeAll`, `afterAll`, `beforeEach`, `afterEach`, and `it` can be declared `async` in environments that support `async`/`await`. ++ */ ++ beforeEach(async function() { ++ await soon(); ++ value = 0; ++ }); ++ ++ /** ++ This spec will not start until the promise returned from the call to `beforeEach` above is settled. And this spec will not complete until the promise that it returns is settled. ++ */ ++ it("should support async execution of test preparation and expectations", async function() { ++ await soon(); ++ value++; ++ expect(value).toBeGreaterThan(0); ++ }); ++ }); ++ ++ ++ /** ++ By default jasmine will wait for 5 seconds for an asynchronous spec to finish before causing a timeout failure. ++ If the timeout expires before `done` is called, the current spec will be marked as failed and suite execution will continue as if `done` was called. ++ ++ If specific specs should fail faster or need more time this can be adjusted by passing a timeout value to `it`, etc. ++ ++ If the entire suite should have a different timeout, `jasmine.DEFAULT_TIMEOUT_INTERVAL` can be set globally, outside of any given `describe`. ++ */ ++ describe("long asynchronous specs", function() { ++ beforeEach(function(done) { ++ done(); ++ }, 1000); ++ ++ if (GLib.getenv('RUN_THOROUGH_TESTS') === 'yes') { ++ it("takes a long time", function(done) { ++ setTimeout(function() { ++ done(); ++ }, 9000); ++ }, 10000); ++ } ++ ++ afterEach(function(done) { ++ done(); ++ }, 1000); ++ }); ++ ++ function soon() { ++ return new Promise(function(resolve, reject) { ++ setTimeout(function() { ++ resolve(); ++ }, 1); ++ }); ++ } ++}); diff --cc subprojects/jasmine-gjs/test/commandSpec.js index 3456d7d30,000000000..3f674bedd mode 100644,000000..100644 --- a/subprojects/jasmine-gjs/test/commandSpec.js +++ b/subprojects/jasmine-gjs/test/commandSpec.js @@@ -1,124 -1,0 +1,125 @@@ +import Gio from 'gi://Gio'; +import GLib from 'gi://GLib'; + +import * as Command from '../src/command.js'; +import * as JUnitReporter from '../src/junitReporter.js'; +import * as TapReporter from '../src/tapReporter.js'; +import * as VerboseReporter from '../src/verboseReporter.js'; + +const {mainloop} = Command; + +describe('Jasmine command', function () { + let fakeJasmine; + + beforeAll(function () { + Gio._promisify(Gio._LocalFilePrototype, 'delete_async', 'delete_finish'); + }); + + beforeEach(function () { + fakeJasmine = jasmine.createSpyObj('jasmine', ['addReporter', 'configureDefaultReporter', 'execute']); ++ fakeJasmine.execute.and.resolveTo(); + spyOn(mainloop, 'runAsync'); // stub out system behaviour + }); + + describe('running specs', function () { + it('shows colors by default', function () { + Command.run(fakeJasmine, []); + expect(fakeJasmine.addReporter) + .toHaveBeenCalledWith(jasmine.objectContaining({show_colors: true})); + }); + + it('allows colors to be turned off', function () { + Command.run(fakeJasmine, ['--no-color']); + expect(fakeJasmine.addReporter) + .toHaveBeenCalledWith(jasmine.objectContaining({show_colors: false})); + }); + + it('lets later color arguments override earlier ones', function () { + Command.run(fakeJasmine, ['--color', '--no-color']); + expect(fakeJasmine.addReporter) + .toHaveBeenCalledWith(jasmine.objectContaining({show_colors: false})); + Command.run(fakeJasmine, ['--no-color', '--color']); + expect(fakeJasmine.addReporter) + .toHaveBeenCalledWith(jasmine.objectContaining({show_colors: true})); + }); + + it('loads the verbose reporter', function () { + Command.run(fakeJasmine, ['--verbose']); + expect(fakeJasmine.addReporter).toHaveBeenCalled(); + const [reporter] = fakeJasmine.addReporter.calls.argsFor(0); + expect(reporter.constructor).toBe(VerboseReporter.VerboseReporter); + }); + + it('loads the TAP reporter', function () { + Command.run(fakeJasmine, ['--tap']); + expect(fakeJasmine.addReporter).toHaveBeenCalled(); + const [reporter] = fakeJasmine.addReporter.calls.argsFor(0); + expect(reporter.constructor).toBe(TapReporter.TapReporter); + }); + + it('loads the JUnit reporter alongside the usual reporter', function () { + // Unfortunately /dev/null can't be opened as a GFile, so we need to + // write to a temporary file. + const [tmpFile, stream] = Gio.File.new_tmp('junitreportXXXXXX'); + const tmpPath = tmpFile.get_path(); + stream.close(null); + + Command.run(fakeJasmine, ['--junit', tmpPath]); + expect(fakeJasmine.addReporter.calls.count()).toBe(2); + const reporters = fakeJasmine.addReporter.calls.allArgs().map(args => args[0].constructor); + expect(reporters).toContain(JUnitReporter.JUnitReporter); + + tmpFile.delete_async(GLib.PRIORITY_DEFAULT, null).then(() => {}); + }); + + it('creates a directory for the report if necessary', function () { + const tmpDir = GLib.dir_make_tmp('junitreportXXXXXX'); + const tmpFile = + Gio.File.new_for_path(tmpDir).get_child('dir').get_child('report.xml'); + const tmpPath = tmpFile.get_path(); + + Command.run(fakeJasmine, ['--junit', tmpPath]); + expect(tmpFile.query_exists(null)).toBeTruthy(); + + tmpFile.delete_async(GLib.PRIORITY_DEFAULT, null) + .then(() => tmpFile.get_parent().delete_async(GLib.PRIORITY_DEFAULT, null)) + .then(() => tmpFile.get_parent().get_parent().delete_async(GLib.PRIORITY_DEFAULT, null)); + }); + + it('uses the value of JASMINE_JUNIT_REPORTS_DIR', function () { + const oldPath = GLib.getenv('JASMINE_JUNIT_REPORTS_DIR'); + const tmpDir = GLib.dir_make_tmp('junitreportXXXXXX'); + GLib.setenv('JASMINE_JUNIT_REPORTS_DIR', tmpDir, true); + + Command.run(fakeJasmine, ['--junit', 'report.xml']); + const reportFile = + Gio.File.new_for_path(tmpDir).get_child('report.xml'); + expect(reportFile.query_exists(null)).toBeTruthy(); + + reportFile.delete_async(GLib.PRIORITY_DEFAULT, null) + .then(() => reportFile.get_parent().delete_async(GLib.PRIORITY_DEFAULT, null)); + + if (oldPath !== null) + GLib.setenv('JASMINE_JUNIT_REPORTS_DIR', oldPath, true); + else + GLib.unsetenv('JASMINE_JUNIT_REPORTS_DIR'); + }); + + it('executes the Jasmine suite', function (done) { + expectAsync(Command.run(fakeJasmine, [])).toBeResolvedTo(0); + // fakeJasmine.execute() is started in idle + GLib.idle_add(GLib.PRIORITY_DEFAULT, function () { + expect(fakeJasmine.execute).toHaveBeenCalled(); + done(); + }); + }); + + it('runs the specified specs', function (done) { + Command.run(fakeJasmine, ['spec/some/fileSpec.js', '--no-color']); + GLib.idle_add(GLib.PRIORITY_DEFAULT, function () { + expect(fakeJasmine.execute).toHaveBeenCalledWith(['spec/some/fileSpec.js']); + done(); + }); + }); + }); +}); diff --cc subprojects/jasmine-gjs/test/custom_matcher.js index 000000000,000000000..067eabfda new file mode 100644 --- /dev/null +++ b/subprojects/jasmine-gjs/test/custom_matcher.js @@@ -1,0 -1,0 +1,127 @@@ ++/** ++ * ++ * Often a project will want to encapsulate custom matching code for use across multiple specs. Here is how to create a Jasmine-compatible custom matcher. ++ * ++ * A custom matcher at its root is a comparison function that takes an `actual` value and `expected` value. This factory is passed to Jasmine, ideally in a call to `beforeEach` and will be in scope and available for all of the specs inside a given call to `describe`. Custom matchers are torn down between specs. The name of the factory will be the name of the matcher exposed on the return value of the call to `expect`. ++ * ++ */ ++ ++/** ++ * This object has a custom matcher named "toBeGoofy". ++ */ ++var customMatchers = { ++ ++ /** ++ * ## Matcher Factories ++ * ++ * Custom matcher factories are passed a `matchersUtil` parameter, which has a set ++ * of utility functions for matchers to use to perform tasks like determining ++ * whether two objects are equal ++ * (see: [`MatchersUtil`][MatchersUtil] for reference documentation). By using ++ * `MatchersUtil` where appropriate, custom matchers can work with ++ * [custom equality testers][CustomEqualityTesters] and ++ * [custom object formatters][CustomObjectFormatters] without any extra effort. ++ * ++ * A second `customEqualityTesters` parameter is passed for compatibility with ++ * Jasmine 3.5 and earlier. Matchers written for Jasmine 3.6 and later should ++ * ignore it. It will no longer be provided in Jasmine 4. ++ * ++ * [MatchersUtil]: /api/edge/MatchersUtil.html ++ * [CustomEqualityTesters]: /tutorials/custom_equality ++ * [CustomObjectFormatters]: /tutorials/custom_object_formatters ++ */ ++ toBeGoofy: function(matchersUtil) { ++ /** ++ * The factory method should return an object with a `compare` function that will be called to check the expectation. ++ */ ++ return { ++ /** ++ * ## A Function to `compare` ++ * ++ * The compare function receives the value passed to `expect()` as the first argument - the actual - and the value (if any) passed to the matcher itself as second argument. ++ */ ++ compare: function(actual, expected) { ++ ++ /** ++ * `toBeGoofy` takes an optional `expected` argument, so define it here if not passed in. ++ */ ++ if (expected === undefined) { ++ expected = ''; ++ } ++ ++ /** ++ * ### Result ++ * ++ * The `compare` function must return a result object with a `pass` property that is a boolean result of the matcher. The `pass` property tells the expectation whether the matcher was successful (`true`) or unsuccessful (`false`). If the expectation is called/chained with `.not`, the expectation will negate this to determine whether the expectation is met. ++ */ ++ var result = {}; ++ ++ /** ++ * `toBeGoofy` tests for equality of the actual's `hyuk` property to see if it matches the expectation. ++ */ ++ result.pass = matchersUtil.equals(actual.hyuk, "gawrsh" + expected); ++ ++ /** ++ * ### Failure Messages ++ * ++ * If left `undefined`, the expectation will attempt to craft a failure message for the matcher. However, if the return value has a `message` property it will be used for a failed expectation. ++ */ ++ if (result.pass) { ++ /** ++ * The matcher succeeded, so the custom failure message should be present in the case of a negative expectation - when the expectation is used with `.not`. ++ */ ++ result.message = "Expected " + actual + " not to be quite so goofy"; ++ } else { ++ /** ++ * The matcher failed, so the custom failure message should be present in the case of a positive expectation ++ */ ++ result.message = "Expected " + actual + " to be goofy, but it was not very goofy"; ++ } ++ ++ /** ++ * Return the result of the comparison. ++ */ ++ return result; ++ } ++ }; ++ } ++}; ++ ++/** ++* ### Custom negative comparators ++* ++* If you need more control over the negative comparison (the `not` case) than the simple boolean inversion above, you can also have your matcher factory include another key, `negativeCompare` alongside `compare`, for which the value is a function to invoke when `.not` is used. This function/key is optional. ++*/ ++ ++/** ++ * ## Registration and Usage ++ */ ++describe("Custom matcher: 'toBeGoofy'", function() { ++ /** ++ * Register the custom matchers with Jasmine. All properties on the object passed in will be available as custom matchers (e.g., in this case `toBeGoofy`). ++ */ ++ beforeEach(function() { ++ jasmine.addMatchers(customMatchers); ++ }); ++ ++ /** ++ * Once a custom matcher is registered with Jasmine, it is available on any expectation. ++ */ ++ it("is available on an expectation", function() { ++ expect({ ++ hyuk: 'gawrsh' ++ }).toBeGoofy(); ++ }); ++ ++ it("can take an 'expected' parameter", function() { ++ expect({ ++ hyuk: 'gawrsh is fun' ++ }).toBeGoofy(' is fun'); ++ }); ++ ++ it("can be negated", function() { ++ expect({ ++ hyuk: 'this is fun' ++ }).not.toBeGoofy(); ++ }); ++}); diff --cc subprojects/jasmine-gjs/test/jasmineBootSpec.js index fd7de3c76,000000000..141b6b66c mode 100644,000000..100644 --- a/subprojects/jasmine-gjs/test/jasmineBootSpec.js +++ b/subprojects/jasmine-gjs/test/jasmineBootSpec.js @@@ -1,191 -1,0 +1,191 @@@ +import Gio from 'gi://Gio'; +import GLib from 'gi://GLib'; + +import * as JasmineBoot from '../src/jasmineBoot.js'; + +const [testFile] = GLib.filename_from_uri(import.meta.url); +const testDir = GLib.path_get_dirname(testFile); + +const customMatchers = { + toMatchAllFiles() { + return { + compare(actual, expected) { + const result = { + message: `Expected ${JSON.stringify(actual)} `, + }; + if (actual.length !== expected.length) { + result.pass = false; + result.message += `to match ${expected.length} ${ + expected.length === 1 ? 'file' : 'files' + }, but it contained ${actual.length}`; + return result; + } + + let unexpectedFile; + result.pass = actual.every(path => { + const actualFile = Gio.File.new_for_path(path); + const retval = expected.some(expectedPath => { + const expectedFile = Gio.File.new_for_path(expectedPath); + return actualFile.equal(expectedFile); + }); + if (!retval) + unexpectedFile = path; + return retval; + }); + if (result.pass) { + result.message += `not to match a list of files ${ + expected}, but it did.`; + } else if (unexpectedFile) { + result.message += `to match a list of files ${expected + }, but it contained ${unexpectedFile}`; + } else { + result.message += `to match the list of files ${expected + }, but it did not: ${actual}`; + } + return result; + }, + }; + }, +}; + +describe('Jasmine boot', function () { + let testJasmine; + + beforeEach(function () { + const bootedJasmine = { + getEnv: jasmine.createSpy('getEnv').and.returnValue({ + addReporter: jasmine.createSpy('addReporter'), + execute: jasmine.createSpy('execute'), + configure: jasmine.createSpy('configure'), + }), + Timer: jasmine.createSpy('Timer'), + Expectation: { + addMatchers: jasmine.createSpy('addMatchers'), + }, + }; + + const fakeJasmineRequireObj = { + core: jasmine.createSpy('core').and.returnValue(bootedJasmine), + interface: jasmine.createSpy('interface'), + }; + + const fakeJasmineCore = { + getJasmineRequireObj() { + return fakeJasmineRequireObj; + }, + __file__: 'fake/jasmine/path/jasmine.js', + }; + + testJasmine = new JasmineBoot.Jasmine({jasmineCore: fakeJasmineCore}); + + jasmine.addMatchers(customMatchers); + }); + + it('adds a nonexistent spec file', function () { + expect(testJasmine.specFiles).toEqual([]); + testJasmine.addSpecFiles([`${testDir}/non/existent/file.js`]); + expect(testJasmine.specFiles).toMatchAllFiles([ + `${testDir}/non/existent/file.js`, + ]); + }); + + it('adds a real spec file', function () { + expect(testJasmine.specFiles).toEqual([]); + testJasmine.addSpecFiles([`${testDir}/fixtures/someSpec.js`]); + expect(testJasmine.specFiles).toMatchAllFiles([ + `${testDir}/fixtures/someSpec.js`, + ]); + }); + + it('adds more than one spec file', function () { + expect(testJasmine.specFiles).toEqual([]); + testJasmine.addSpecFiles([ + `${testDir}/fixtures/someSpec.js`, + `${testDir}/fixtures/otherSpec.js`, + ]); + expect(testJasmine.specFiles).toMatchAllFiles([ + `${testDir}/fixtures/someSpec.js`, + `${testDir}/fixtures/otherSpec.js`, + ]); + }); + + it('adds a whole directory of spec files', function () { + expect(testJasmine.specFiles).toEqual([]); + testJasmine.addSpecFiles([`${testDir}/fixtures`]); + expect(testJasmine.specFiles).toMatchAllFiles([ + `${testDir}/fixtures/include/module.js`, + `${testDir}/fixtures/include/spec.js`, + `${testDir}/fixtures/otherSpec.js`, + `${testDir}/fixtures/path1/test.js`, + `${testDir}/fixtures/path2/test.js`, + `${testDir}/fixtures/someSpec.js`, + `${testDir}/fixtures/syntaxErrorSpec.js`, + ]); + expect(testJasmine.specFiles.every(path => path.indexOf('notASpec.txt') === -1)).toBe(true); + }); + + it('adds spec files in different directories with the same name', function () { + testJasmine.addSpecFiles([ + `${testDir}/fixtures/path1`, + `${testDir}/fixtures/path2`, + ]); + expect(testJasmine.specFiles).toMatchAllFiles([ + `${testDir}/fixtures/path1/test.js`, + `${testDir}/fixtures/path2/test.js`, + ]); + }); + + it('respects excluded files', function () { + testJasmine.exclusions = ['otherSpec.js', 'syntaxErrorSpec.js']; + testJasmine.addSpecFiles([`${testDir}/fixtures`]); + expect(testJasmine.specFiles).toMatchAllFiles([ + `${testDir}/fixtures/include/module.js`, + `${testDir}/fixtures/include/spec.js`, + `${testDir}/fixtures/someSpec.js`, + `${testDir}/fixtures/path1/test.js`, + `${testDir}/fixtures/path2/test.js`, + ]); + }); + + it('matches at the end of the containing path', function () { + testJasmine.exclusions = ['test/fixtures']; + testJasmine.addSpecFiles([`${testDir}/fixtures`]); + expect(testJasmine.specFiles).toMatchAllFiles([ + `${testDir}/fixtures/include/module.js`, + `${testDir}/fixtures/include/spec.js`, + `${testDir}/fixtures/path1/test.js`, + `${testDir}/fixtures/path2/test.js`, + ]); + }); + + it('can handle globs in excluded files', function () { + testJasmine.exclusions = ['*.js']; + testJasmine.addSpecFiles([`${testDir}/fixtures`]); + expect(testJasmine.specFiles).toMatchAllFiles([]); + }); + + it('adds the Jasmine path when adding a reporter', function () { + const fakeReporter = {}; + testJasmine.addReporter(fakeReporter); + expect(fakeReporter.jasmine_core_path).toMatch('fake/jasmine/path'); + }); + + it('imports spec files in different directories with the same name', function () { + testJasmine.addSpecFiles([ + `${testDir}/fixtures/path1`, + `${testDir}/fixtures/path2`, + ]); + expectAsync(testJasmine.loadSpecs()).toBeRejectedWithError(Error, + 'Catch this error to ensure this file is loaded'); + }); + + it('does not bail out altogether if one of the specs has a syntax error', function () { + testJasmine.addSpecFiles([`${testDir}/fixtures/syntaxErrorSpec.js`]); - expect(() => testJasmine.loadSpecs()).not.toThrow(); ++ expectAsync(testJasmine.loadSpecs()).toBeResolved(); + }); + + it('does not bail out altogether if one of the specs does not exist', function () { + testJasmine.addSpecFiles(['non/existent/file.js']); - expect(() => testJasmine.loadSpecs()).not.toThrow(); ++ expectAsync(testJasmine.loadSpecs()).toBeResolved(); + }); +});